Making Emacs Start Up Faster
Posted on In Linux, TutorialI use Emacs in terminals and start/close Emacs frequently as needed like in a file checking-editing-closing loop. However, Emacs seems take some time to start up especially some heavy modes are used. How to make Emacs start up faster?
(If you just want the solution/script first, find the command in the summary section.)
Table of Contents
My solution is to make use of the server/client feature of Emacs
This is how it works.
Emacs supports server/client architecture which is the key mechanism for faster Emacs startup here. Starting the server once and it is acceptable if it takes some time. When editing a file, start an Emacs client to connect to the server to edit the file, which is fast.
However, several other tunnings/scripts are need to make it more handy.
How and when to start the Emacs server?
Invoking it at the startup of the desktop environment as a autostart script?—What if the server is killed? What if you are working on a remote server? Manually start it?—It will too annoying.
Either choice is not good enough. On the other hand, the emacsclient
‘s -a
option has a very nice feature: “If the value of EDITOR is the empty string, run emacs --daemon
to start Emacs in daemon mode, and try to connect to it”. So, with the -a=""
option in the command, the first time the emacsclient
is invoked and there is no server running, the Emacs server is automatically started.
After each invoking of the emacsclient, should I always switch to the server instance?
Not needed. Emacs support the convenient “multiple tty” feature. With the -c
option, emacsclient
starts a new frame just at the terminal or console where it is invoked: “-c, –create-frame create a new frame instead of trying to use the current Emacs frame”.
How to manually shutdown the Emacs server?
Simply killing the Emacs is not safe—some files may have been changed and not saved yet. Let’s use an elisp function to save the buffers and kill the emacs in the ~/.emacs
:
;; define function to shutdown emacs server instance
(defun server-shutdown ()
"Save buffers, Quit, and Shutdown (kill) server"
(interactive)
(save-some-buffers)
(kill-emacs))
When you want to kill the emacs server, run emacsclient -e '(server-shutdown)'
which can be put into a command file like em-server-shutdown
.
In summary, the command
The key is this command: emacsclient -c -a="" $*
. For faster invoking, save it as a executable command, like em
, in some directory in your $PATH
:
#!/bin/env bash
emacsclient -c -a="" $*
When you want to edit a file, simply run em file
.
All the functions/scripts can be found in my Emacs config.
How do you do teh setup for emacs GUI for OSX. I am using emacs.app
I have no experience with Emacs on OSX. But the server-client mechanism may still help.
With an Emacs running in a GUI window, the `emacsclient` can open the file in the Emacs window which started the server. You may also choose to open the file in the current frame or create a new frame: https://www.systutorials.com/docs/linux/man/1-emacsclient/ .