NB: The Emacs world uses the word frame to refer to what in most other contexts is called window, and uses the word window to describe something else. In this post, however, the word window always refers to an X11 window.
I routinely run subordinate shells under Emacs. In these shells I often need to run programs that pop up a separate graphics window and then proceed to display sequences of images (charts of scientific data) in this window. After displaying each image in the sequence, the program prints a prompt such as
Hit <Return> to see next plot:
...and pauses for user input1.
Unfortunately, at this point the graphic window has the focus, and does not respond to any keyboard input.
Therefore, in order to see every next image, one must first switch the focus to the Emacs window before one can press Return.
This is no big deal when the sequence consists of 2-3 pictures, especially since I can switch the focus from the keyboard (with Alt+Tab but the utility of this sort of program is to be able to quickly inspect tens (sometimes even hundreds) of images. It is in this use-case that the extra step of returning the focus to the Emacs window starts getting seriously in the way.
Is there a way to configure Emacs so that, whenever a subordinate program pops up a new window
- the Emacs window retains the focus; and
- the new window (even without the focus) remains always on top of the Emacs window2
?
(Of these two items, the first one is far more important than the second one.)
1A quick example of the problem, for those who have R
installed, is the following: (1) start a sub-shell (M-x shell
); (2) in this shell start an interactive R
session; (3) in the R
session run the command example(plot)
. This will present a sequence of examples from the plot
command's documentation page. (If you have the ESS (aka Emacs Speaks Statistics) package installed, steps (1) and (2) can be replaced with the command M-x R
.) This example is a somewhat different use-case from the one I'm dealing with, since it's about displaying documentation rather than data, but it is one that others can more readily try out than my actual use-case, and conveys all the essential information.
2 When working with a small screen (e.g. a laptop) the focus-switching business entails the additional (though more tractable) inconvenience that the window with the focus, by default, obscures all other windows. This means that, when the Emacs window is maximized (as is normally the case when I work on my laptop, for example), switching focus entails obscuring the plot temporarily. This greatly hampers the ability to make visual comparisons between a plot and its successor. As already said, this problem is at least solvable: un-maximize the Emacs window, and give it a size consistent with having both it and the graphic window simultaneously visible.
(redirect-frame-focus (selected-frame) FRAME)
, whereFRAME
is the previously selected frame, with the active minibuffer. You can also useselect-frame-set-input-focus
to switch the focus. – Drew May 15 '17 at 14:17