Emacs can start up almost as fast as Vim

My own configuration which includes a number of plugins can now load in about 200ms. With Vim modal editing emulation through evil-mode it is suitable as default $EDITOR in the terminal. This enables convenient editing of git commit messages, or random one-off changes where I usually resorted to plain vim. So much so that I've set alias vim=emacs -nw.

The trick turned out to be quite simple: you need to lazy-load most of the packages. When you run the editor, you're likely only using a subset of extensions like syntax highlighting for the programming language that your initial buffer is in. So no need to spend CPU time on things that you either don't need or use later.

Latest versions of Emacs have use-package module built in that allows to succintly describe configuration of plugins and set the rules of when they should be loaded. Here's an example of configuration for org-roam, a plugin I use for note-taking:


(use-package org-roam
  :ensure t
  :defer t
  :bind
  ("C-c n l" . org-roam-buffer-toggle)
  ("C-c n i" . org-roam-node-insert)
  ("C-c n f" . org-roam-node-find)
  ("C-c n r" . consult-org-roam-search)
  ("C-c n d" . org-roam-dailies-goto-today)
  ("C-c n w" . org-roam-week)

  ...
  )

Here, :defer flag means that the module shouldn't be eagerly loaded. The :bind specifies keybindings that should trigger specific actions of this module. As soon as you type those key combinations - only then the module will be loaded.

Some packages like which-key that are not needed immediately, can be loaded with a delay:


(use-package which-key
  :ensure t
  :defer 2
  :config
  (which-key-mode)
  (which-key-setup-side-window-bottom)
  )

Here, :defer 2 means "load this plugin 2 seconds after the startup". This allows you to open and start editing a file and the plugin will be loaded in the background.

Really, it all boils down to carefully using :defer, and most of the load time can be shaved off. With so much stuff already in the standard package, you can probably even put emacs to your devserver, scp the config there, and it should just work.