* How to use defadvice without infinite loop
@ 2003-09-27 15:09 Ivan Kanis
2003-09-27 20:22 ` Robert Marshall
2003-09-28 5:14 ` Klaus Berndl
0 siblings, 2 replies; 5+ messages in thread
From: Ivan Kanis @ 2003-09-27 15:09 UTC (permalink / raw)
I want to save VM files to _always_ be saved before calling the function
save-some buffers.
I am tired of answering 'yes' for these files when grepping, compiling
or quiting emacs.
I came up with a defadvice function but the proble is that it's
calling save-some-buffers and it produces an infinite loop. Is there a
way to avoid that?
(defadvice save-some-buffers(before my-save-some-buffers activate)
"Ask to save buffers."
(interactive)
(save-some-buffers nil 'my-always-save))
(defun my-always-save()
"Files to always save."
(when buffer-file-name
(when (string-match "^/home/ivank/mail" buffer-file-name)
(save-buffer))))
--
/-----------------------------------------------------------------------------*
| "When a man is attempting to describe another person's | |
| character, he may be right or he may be wrong, but | Ivan Kanis |
| in one thing he will always succeed,that is, in | Software Developper|
| describing himself." | www.kanis.cc |
| (Samuel Taylor Coleridge) | |
*-----------------------------------------------------------------------------/
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to use defadvice without infinite loop
2003-09-27 15:09 How to use defadvice without infinite loop Ivan Kanis
@ 2003-09-27 20:22 ` Robert Marshall
2003-09-28 5:14 ` Klaus Berndl
1 sibling, 0 replies; 5+ messages in thread
From: Robert Marshall @ 2003-09-27 20:22 UTC (permalink / raw)
On 27 Sep 2003, Ivan Kanis wrote:
> I want to save VM files to _always_ be saved before calling the
> function save-some buffers.
>
> I am tired of answering 'yes' for these files when grepping,
> compiling or quiting emacs.
>
> I came up with a defadvice function but the proble is that it's
> calling save-some-buffers and it produces an infinite loop. Is there
> a way to avoid that?
>
> (defadvice save-some-buffers(before my-save-some-buffers activate)
> "Ask to save buffers."
> (interactive)
> (save-some-buffers nil 'my-always-save))
>
> (defun my-always-save()
> "Files to always save."
> (when buffer-file-name
> (when (string-match "^/home/ivank/mail" buffer-file-name)
> (save-buffer))))
>
use
(ad-set-arg 1 'my-always-save)
and don't call save-some-buffers in the advice
(totally untested... but the info on 'Argument Access in Advice' is worth reading)
Robert
--
La grenouille songe..dans son château d'eau
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to use defadvice without infinite loop
2003-09-27 15:09 How to use defadvice without infinite loop Ivan Kanis
2003-09-27 20:22 ` Robert Marshall
@ 2003-09-28 5:14 ` Klaus Berndl
2003-09-29 4:58 ` Ivan Kanis
1 sibling, 1 reply; 5+ messages in thread
From: Klaus Berndl @ 2003-09-28 5:14 UTC (permalink / raw)
On 27 Sep 2003, Ivan Kanis wrote:
> I want to save VM files to _always_ be saved before calling the function
> save-some buffers.
>
> I am tired of answering 'yes' for these files when grepping, compiling
> or quiting emacs.
>
> I came up with a defadvice function but the proble is that it's
> calling save-some-buffers and it produces an infinite loop. Is there a
> way to avoid that?
>
> (defadvice save-some-buffers(before my-save-some-buffers activate)
> "Ask to save buffers."
> (interactive)
> (save-some-buffers nil 'my-always-save))
The infinite loop comes because the `save-some-buffers' in your advice calls
the adviced version of `save-some-buffers' again and then again and then
again.... Normally i should write here: RTFM ;-) You should definitely read
the advice info-manual - there are some very simple and helpful examples in
it!
(defadvice save-some-buffers(before my-save-some-buffers activate)
"Ask to save buffers."
(ad-set-arg 1 'my-always-save))
This is all...test it!
>
> (defun my-always-save()
> "Files to always save."
> (when buffer-file-name
> (when (string-match "^/home/ivank/mail" buffer-file-name)
> (save-buffer))))
Ciao,
Klaus
--
Klaus Berndl mailto: klaus.berndl@sdm.de
sd&m AG http://www.sdm.de
software design & management
Thomas-Dehler-Str. 27, 81737 München, Germany
Tel +49 89 63812-392, Fax -220
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to use defadvice without infinite loop
2003-09-28 5:14 ` Klaus Berndl
@ 2003-09-29 4:58 ` Ivan Kanis
2003-09-29 15:08 ` Stefan Monnier
0 siblings, 1 reply; 5+ messages in thread
From: Ivan Kanis @ 2003-09-29 4:58 UTC (permalink / raw)
Klaus> (defadvice save-some-buffers(before my-save-some-buffers
Klaus> activate)
Klaus> "Ask to save buffers." (ad-set-arg 1 'my-always-save))
Klaus> This is all...test it!
It doesn't work, I need to call the function save-some-buffers
twice. I am not trying to substitute it's arguments. I have found this
code prevents the infinite loop, so far it seems to work well...
(defadvice save-some-buffers(before my-save-some-buffers activate)
"Ask to save buffers."
(interactive)
;; Prevent infinite loop
(ad-deactivate-regexp "my-save-some-buffers")
(save-some-buffers nil 'my-always-save)
(ad-activate-regexp "my-save-some-buffers"))
(defun my-always-save()
"Files to always save."
(when buffer-file-name
(when (string-match "^/home/ivank/mail" buffer-file-name)
(vm-save-buffer nil))))
--
/-----------------------------------------------------------------------------*
| "Love your enemy, it will drive him nuts." | Ivan Kanis |
| (Eleanor Doan) | Software Developper |
| | www.kanis.cc |
*-----------------------------------------------------------------------------/
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to use defadvice without infinite loop
2003-09-29 4:58 ` Ivan Kanis
@ 2003-09-29 15:08 ` Stefan Monnier
0 siblings, 0 replies; 5+ messages in thread
From: Stefan Monnier @ 2003-09-29 15:08 UTC (permalink / raw)
> (defadvice save-some-buffers(before my-save-some-buffers activate)
> "Ask to save buffers."
> (interactive)
> ;; Prevent infinite loop
> (ad-deactivate-regexp "my-save-some-buffers")
> (save-some-buffers nil 'my-always-save)
> (ad-activate-regexp "my-save-some-buffers"))
You can try an `around' advice instead of a `before' advice, and then put
two `ad-do-it' in there, modifying the args in between the two calls.
Pretty ugly as well. Maybe the doc suggests a cleaner way to do what
you want.
Stefan
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2003-09-29 15:08 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-09-27 15:09 How to use defadvice without infinite loop Ivan Kanis
2003-09-27 20:22 ` Robert Marshall
2003-09-28 5:14 ` Klaus Berndl
2003-09-29 4:58 ` Ivan Kanis
2003-09-29 15:08 ` Stefan Monnier
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).