Search code examples
bashemacsemacsclient

How do I start emacs from the command line but use emacsclient if a server is already running?


I'm using emacs under Ubuntu

If I want to edit a.txt then I either click on the emacs icon or use

$ emacs  --geometry 10x10 --fullscreen --no-splash ~/a.txt &

from bash. My .emacs file starts the emacs server.

If I then want to edit another file from the command line, I use

$ emacsclient -n ~/b.txt

to load the file into the existing emacs.

but I keep getting it wrong, and all hell breaks loose in various ways.

How would I make a bash command 'e', that checks whether the emacs server is already running, and executes the appropriate command?

Attempts to use the emacsclient -a switch invariably produce undesirable and ill-determined behaviour.

Extra points if it can 'do the right thing' when run on a console too.


Solution

  • So far this function definition in .bashrc seems to be a perfect solution:

    function e #open emacs in background and disown it, or if already running use emacsclient
    {
     echo "emacs function backgrounds and disowns emacs, or calls client if server already running; see .bashrc";
     local FLUFFY="$@";
     local SERVERSOCKET=/tmp/emacs${UID}/server ;
     echo "trying to open: " $FLUFFY 
     echo " checking: " $SERVERSOCKET "for emacs server " ;
     # test for existence of emacs server socket 
     if [ -e $SERVERSOCKET ]; then
         echo "using emacsclient"
         emacsclient -n $FLUFFY;
     else
         echo "starting emacs: make tea..."
         emacs  --geometry 10x10 --fullscreen --no-splash $FLUFFY & disown ;
     fi;
    }
    

    which was derived from this incantation:

    FLUFFY=~/b.txt ; if [ -e /tmp/emacs1000/server ]; then emacsclient -n $FLUFFY; else emacs  --geometry 10x10 --fullscreen --no-splash $FLUFFY & fi;
    

    which does what I want by checking for the existence of the emacs server socket for user 1000.