* Show *compilation* only if build did not succeed
@ 2018-12-22 15:12 Amin Bandali
2018-12-22 16:49 ` Stefan Monnier
0 siblings, 1 reply; 7+ messages in thread
From: Amin Bandali @ 2018-12-22 15:12 UTC (permalink / raw)
To: help-gnu-emacs
Hello,
I use a literate init.org configuration for my GNU Emacs, which I
automatically tangle into init.el on each save and then call ‘make’
using something like (compile "make ti").
Here’s my problem: invoking compile creates a new window, and that
annoys me to no end, esp. since I save my init.org frequently while
editing. So I’ve wrapped the call to compile in a call to
save-window-excursion which causes compile to not create a window. But
ideally the window would be created if compilation did not succeed.
Recently I found the following snippet¹ on Stack Overflow:
#+begin_src emacs-lisp
(defun brian-compile-finish (buffer outstr)
(unless (string-match "finished" outstr)
(switch-to-buffer-other-window buffer))
t)
(setq compilation-finish-functions 'brian-compile-finish)
(require 'cl)
(defadvice compilation-start
(around inhibit-display
(command &optional mode name-function highlight-regexp))
(if (not (string-match "^\\(find\\|grep\\)" command))
(flet ((display-buffer)
(set-window-point)
(goto-char))
(fset 'display-buffer 'ignore)
(fset 'goto-char 'ignore)
(fset 'set-window-point 'ignore)
(save-window-excursion
ad-do-it))
ad-do-it))
(ad-activate 'compilation-start)
#+end_src
But the problem with the above is that, if you look at the defadvice, it
uses flet, which has been obsolete since 24.3, and so I get an annoying
warning on every startup (I byte-compile my init.el).
Are there any “modern” solutions for achieving this? If not, it would
be great if one could customize the behaviour of when compile would
create a window, depending on the build result or if the build takes
longer than a certain time threshold.
Thanks,
amin
Footnotes:
¹ https://stackoverflow.com/a/17788551
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Show *compilation* only if build did not succeed
2018-12-22 15:12 Show *compilation* only if build did not succeed Amin Bandali
@ 2018-12-22 16:49 ` Stefan Monnier
2018-12-22 17:52 ` Amin Bandali
0 siblings, 1 reply; 7+ messages in thread
From: Stefan Monnier @ 2018-12-22 16:49 UTC (permalink / raw)
To: help-gnu-emacs
> But the problem with the above is that, if you look at the defadvice, it
> uses flet, which has been obsolete since 24.3, and so I get an annoying
> warning on every startup (I byte-compile my init.el).
> Are there any “modern” solutions for achieving this?
Yes: the two replacements suggested by the warning.
Stefan
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Show *compilation* only if build did not succeed
2018-12-22 16:49 ` Stefan Monnier
@ 2018-12-22 17:52 ` Amin Bandali
2018-12-22 18:21 ` Stefan Monnier
0 siblings, 1 reply; 7+ messages in thread
From: Amin Bandali @ 2018-12-22 17:52 UTC (permalink / raw)
To: Stefan Monnier; +Cc: help-gnu-emacs
On 2018-12-22 11:49 AM, Stefan Monnier wrote:
>
> Yes: the two replacements suggested by the warning.
>
Thanks for the reply, Stefan. I had already tried both, but for some
reason I could not get it to work. I gave it another shot, and it seems
like I got it right this time around.
For future reference, here’s what I ended up with in my config:
#+begin_src emacs-lisp
(defun amin--compilation-finish-function (buffer outstr)
(unless (string-match "finished" outstr)
(switch-to-buffer-other-window buffer))
t)
(setq compilation-finish-functions #'amin--compilation-finish-function)
(require 'cl-macs)
(defadvice compilation-start
(around inhibit-display
(command &optional mode name-function highlight-regexp))
(if (not (string-match "^\\(find\\|grep\\)" command))
(cl-letf (((symbol-function 'display-buffer) #'ignore)
((symbol-function 'set-window-point) #'ignore)
((symbol-function 'goto-char) #'ignore))
(save-window-excursion ad-do-it))
ad-do-it))
(ad-activate 'compilation-start)
#+end_src
Best,
amin
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Show *compilation* only if build did not succeed
2018-12-22 17:52 ` Amin Bandali
@ 2018-12-22 18:21 ` Stefan Monnier
2018-12-22 19:09 ` Amin Bandali
0 siblings, 1 reply; 7+ messages in thread
From: Stefan Monnier @ 2018-12-22 18:21 UTC (permalink / raw)
To: Amin Bandali; +Cc: help-gnu-emacs
> (defadvice compilation-start
> (around inhibit-display
> (command &optional mode name-function highlight-regexp))
> (if (not (string-match "^\\(find\\|grep\\)" command))
> (cl-letf (((symbol-function 'display-buffer) #'ignore)
> ((symbol-function 'set-window-point) #'ignore)
> ((symbol-function 'goto-char) #'ignore))
> (save-window-excursion ad-do-it))
> ad-do-it))
BTW, is the `goto-char` override really effective?
It doesn't affect calls to goto-char made from byte-compiled code, so
there's a good chance that it ends up not doing anything.
Stefan
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Show *compilation* only if build did not succeed
2018-12-22 18:21 ` Stefan Monnier
@ 2018-12-22 19:09 ` Amin Bandali
2018-12-23 14:29 ` Stefan Monnier
0 siblings, 1 reply; 7+ messages in thread
From: Amin Bandali @ 2018-12-22 19:09 UTC (permalink / raw)
To: Stefan Monnier; +Cc: help-gnu-emacs
On 2018-12-22 1:21 PM, Stefan Monnier wrote:
>
> BTW, is the `goto-char` override really effective?
> It doesn't affect calls to goto-char made from byte-compiled code, so
> there's a good chance that it ends up not doing anything.
>
Ha, I think you’re right :) Taking out goto-char and set-window-point
don’t seem to have any effects, that I could tell at least.
Out of curiosity, is there any way to silence the “ad-handle-definition:
‘compilation-start’ got redefined” warning locally? I tried wrapping my
workaround in a (let ((ad-redefinition-action 'accept)) ...), but that
doesn’t seem to do it.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Show *compilation* only if build did not succeed
2018-12-22 19:09 ` Amin Bandali
@ 2018-12-23 14:29 ` Stefan Monnier
2018-12-23 14:59 ` Amin Bandali
0 siblings, 1 reply; 7+ messages in thread
From: Stefan Monnier @ 2018-12-23 14:29 UTC (permalink / raw)
To: Amin Bandali; +Cc: help-gnu-emacs
> Out of curiosity, is there any way to silence the “ad-handle-definition:
> ‘compilation-start’ got redefined” warning locally? I tried wrapping my
> workaround in a (let ((ad-redefinition-action 'accept)) ...), but that
> doesn’t seem to do it.
ad-redefinition-action is consulted when compilation-start is defined
(i.e. when loading compile.el), that's why your let has no effect.
If you use the newer `advice-add` instead of the older `defadvice` you
shouldn't get any warning (it's one of the "features" I didn't bother
to port).
But you can also just do
(setq ad-redefinition-action 'accept)
Stefan
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Show *compilation* only if build did not succeed
2018-12-23 14:29 ` Stefan Monnier
@ 2018-12-23 14:59 ` Amin Bandali
0 siblings, 0 replies; 7+ messages in thread
From: Amin Bandali @ 2018-12-23 14:59 UTC (permalink / raw)
To: Stefan Monnier; +Cc: help-gnu-emacs
Hi Stefan,
On 2018-12-23 9:29 AM, Stefan Monnier wrote:
>> Out of curiosity, is there any way to silence the “ad-handle-definition:
>> ‘compilation-start’ got redefined” warning locally? I tried wrapping my
>> workaround in a (let ((ad-redefinition-action 'accept)) ...), but that
>> doesn’t seem to do it.
>
> ad-redefinition-action is consulted when compilation-start is defined
> (i.e. when loading compile.el), that's why your let has no effect.
>
> If you use the newer `advice-add` instead of the older `defadvice` you
> shouldn't get any warning (it's one of the "features" I didn't bother
> to port).
That makes sense, thanks. And TIL about advice-add! On a side note, it
seems wrapping the workaround in a (with-eval-after-load 'compile ...)
also suppresses the warning, without needing ad-redefinition-action set.
> But you can also just do
>
> (setq ad-redefinition-action 'accept)
Indeed. My reasoning was to try and minimize its effect in my init file
so that I would still be able to see the warning if triggered elsewhere.
>
>
> Stefan
>
Best,
amin
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-12-23 14:59 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-12-22 15:12 Show *compilation* only if build did not succeed Amin Bandali
2018-12-22 16:49 ` Stefan Monnier
2018-12-22 17:52 ` Amin Bandali
2018-12-22 18:21 ` Stefan Monnier
2018-12-22 19:09 ` Amin Bandali
2018-12-23 14:29 ` Stefan Monnier
2018-12-23 14:59 ` Amin Bandali
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.