I'm regularly compiling some C programs and one thing is annoying : after I've compiled, I'm opening a shell with M-x shell ./foo, but the shell open in place of the source code's window. I would like the shell buffer to open in place of the compilation window, which I don't really need anymore. Otherwise, it's an overkill.

I've read about this topic open buffer in a specified frame but my emacs lisp competence are not that great and I can't adapt it to my case.

Thanks in advance! I guess I'm not the only one it can help.


I've added a screenshot to make things clearer. Let's call the above window "A" and the below "B". When I call the shell, i.e M-x shell (I rather use M-x term but that the same here), A has the focus, which is probably the reason why the shell window open in place of A. I want it to open in place of A (originally the compilation window).


  • Are you familiar with the difference between Emacs terminology of a frame and a window, and do you really mean frame? What's the difference between a buffer, a file, a window, and a frame?: emacs.stackexchange.com/questions/13583/…
    – lawlist
    Commented Nov 2, 2016 at 15:48
  • Yes you're right, I may edit my question accordingly. I hope my question makes sense though.
    – loukios
    Commented Nov 2, 2016 at 15:54
  • I would recommend specifying how many windows are open and in what layout -- e.g., side by side, and label them such as A = left window = source code buffer and B = right window = compilation buffer; the window that has focus before calling M-x shell is A or B; after calling M-x shell, B should become *shell* or A should become *shell*. Focus should be in the *shell* buffer (window A or B) when done.
    – lawlist
    Commented Nov 2, 2016 at 15:58
  • I like to modify the source code and/or create new functions, whereas most people prefer things like advice, the display-buffer-alist, special-display-regexps, etc. If it were me, I would just copy the shell function and rename it to something like my-shell and I would change (pop-to-buffer buffer) to whatever floats my boat -- e.g., (switch-to-buffer buffer) assuming that I am in the window that I want to contain the *shell* buffer when I'm done typing M-x my-shell. I suspect there are already several threads that suggest the other three (3) above-mentioned alternatives.
    – lawlist
    Commented Nov 2, 2016 at 16:11
  • The same concept with term, but it is reversed -- since the function term uses (switch-to-buffer "*terminal*") and perhaps you want (pop-to-buffer "*terminal*"). To read about pop-to-buffer, type M-x describe-function RET pop-to-buffer RET: "Select buffer BUFFER in some window, preferably a different one. BUFFER may be a buffer, a string (a buffer name), or nil. If it is a string not naming an existent buffer, create a buffer with that name. If BUFFER is nil, choose some other buffer. Return the buffer."
    – lawlist
    Commented Nov 2, 2016 at 16:17


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.