7

Is it possible to run gnus or other things that tend to frequently block in a separate emacs instance and "forward the buffers" to the main emacs instance. I guess more generally I am wondering what kind of communication between emacs instances is possible.

Greg Nisbet
  • 857
  • 5
  • 19
  • Not an answer to your question, but just a few thoughts -- many people seem to run multiple Emacs instances for lack of a better method to keep buffers organized. Communications problems between multiple instances can be avoided by not having them -- i.e., better organization with just one instance -- e.g., organizing by frames using `frame-bufs` https://github.com/alpaker/Frame-Bufs or a variety of other organizational libraries (e.g., projects, etc.). In a nutshell, there are many ways to effectively organize an enormous volume of active buffers within one Emacs instance. – lawlist Sep 02 '15 at 20:46
  • I'm starting to use `el-screen` for buffer organization, but a project-oriented approach might make more sense. I'm envisioning more of a master emacs and a few headless worker emacses that do blocking things like `gnus`. Simplest possible solution the emacses communicate over sockets or the master emacs spawns an ephemeral worker and all communication is done over stdin and stdout, but then I would need to go to a lot of trouble to serialize and deserialize emacs-specific objects (that is the hard work I am trying to avoid). – Greg Nisbet Sep 02 '15 at 21:01
  • Ah, I see . . . yes, I usually get a cup of coffee or check out the latest questions on stackexchange while I am getting/sending email for the first time after launching Emacs -- i.e., I feel your pain. Subsequent email checks/sends are much quicker with Wanderlust, but the initial check/send with thousands of stored emails can be a few minutes in duration. – lawlist Sep 02 '15 at 21:07
  • @lawlist, I tried running mutt inside ansiterm because then only ansiterm would lock up, but the refresh rate was awful (and I couldn't figure out how to disable the background coloring in mutt). I also tried using wanderlust but couldn't figure out how configure it for gmail (I have an empty Desktop folder with nothing in it). – Greg Nisbet Sep 02 '15 at 21:25
  • I use mu4e, which uses an async process to download mail. (Sending is still a problem, but usually less so, since it's just one message.) – mbork Sep 04 '15 at 12:29

2 Answers2

4

Make sure that each Emacs instance runs a daemon with a unique name. Set the variable server-start to choose the server name, for example

emacs --daemon &          # Normal instance with the default server name ("server")
emacs --daemon=gnus &     # Instance for GNUS only

From one instance, you can execute code in another instance with the function server-eval-at. The value of the expression is returned to the local instance. It needs to be a value that can be read back: integers, strings, lists and other “transparent” data structures are ok, but you can transfer buffers, frames, etc. this way.

You can use this facility to tell another instance to open a frame, to list the buffer names in another instance, etc. Note that if the other instance is busy, your code will block until it replies to the daemon.

(server-eval-at "gnus" `(frame-parameter
                          (make-frame-on-display ,(frame-parameter (selected-frame) 'display))
                          window-id))

There isn't much code out there that uses this facility: most Emacs users run a single instance. So whatever you want to do, you'd probably have to do some coding work.

  • You can simply say `emacs --daemon=gnus` instead of `emacs --daemon --eval '(setq server-name "gnus")'` – phils Oct 04 '15 at 14:18
0

Emacsclient

Use instead of Emacs the Emacsclient. First you have to do a (server-start) in your Emacs(en) and then run the client in its own frame with emacsclient -c test.mac.

You might also distinguish different server files with the options -f ServerFile (on Windows) or server names -s ServerName. Please have a look at http://www.gnu.org/software/emacs/manual/html_node/emacs/emacsclient-Options.html. To that end you have to set different server names for the different Emacsen: (setq server-name "Server1"), etc.

Dieter.Wilhelm
  • 1,836
  • 14
  • 25
  • Can emacsclient connect to multiple daemons? – Greg Nisbet Sep 04 '15 at 05:31
  • I'm afraid I don't understand fully your use cases. Could you give us examples please. – Dieter.Wilhelm Sep 04 '15 at 05:34
  • 1
    mail-reading programs like gnus or wanderlust lock the ui while updating. I don't really need these programs to interact with the rest of emacs most of the time, but would like the buffers to be managed in a single context so I don't need to switch back and forth between the email emacs and the everything else emacs. I know that certain packages like helm use a separate emacs instance to avoid blocking, and was wondering if there's a way to display the buffers from another emacs instance instead of rewriting part of an existing emacs client to be less synchronous. – Greg Nisbet Sep 04 '15 at 05:49
  • @GregoryNisbet: I see, I've updated my answer to include your answer about multiple daemons or Emacs server instances, hope it help... – Dieter.Wilhelm Sep 04 '15 at 08:33
  • 2
    Wouldn't it be same as running different instances of emacs, since at a time an instance of emacsclient would be able to access the buffers of only one emacs sever? – Iqbal Ansari Sep 04 '15 at 08:53