Emacs 29 Quick Start

Posted: emacs

Update: I created Emacs Starter Kit as an even quicker way to get up and running with Emacs. It uses the settings from this guide and throws in some extras for various programming languages. Check it out!

The no-nonsense guide to getting started with Emacs.

By the end of this guide you'll have Emacs 29 configured with better default settings, IDE features like code-completion and LSP support, and much improved minibuffer completion. Everything listed here is available out of the box or downloaded from the default Emacs package server, GNU Elpa.


Begin by installing Emacs 29 for your OS:

Emacs 29 isn't technically released, but as far as release previews go Emacs is as stable as it gets. It's important that you install Emacs 29 and not a prior version. This guide uses both eglot and use-package, two packages introduced in Emacs 29.

Run through the tutorial

Go ahead and launch Emacs. You're greeted with the startup screen which presents a bunch of useful information and a dated logo. Of particular note is the Emacs tutorial, which you should click on before continuing with the rest of this guide.

You can also launch the tutorial via C-h t. (What is C-h?)


You've installed Emacs and you know some basic commands. It's time to edit your emacs configuration file:

C-x C-f ~/.emacs.d/init.el

Drop in the following Emacs Lisp code:

;; Performance tweaking for modern machines
(setq gc-cons-threshold 100000000)
(setq read-process-output-max (* 1024 1024))

;; Hide UI
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)

;; Better default modes
(electric-pair-mode t)
(show-paren-mode 1)
(setq-default indent-tabs-mode nil)
(save-place-mode t)
(savehist-mode t)
(recentf-mode t)
(global-auto-revert-mode t)

;; Better default settings
(require 'uniquify)
(setq uniquify-buffer-name-style 'forward
      window-resize-pixelwise t
      frame-resize-pixelwise t
      load-prefer-newer t
      backup-by-copying t
      custom-file (expand-file-name "custom.el" user-emacs-directory))
(add-hook 'prog-mode-hook 'display-line-numbers-mode)

;; Refresh package archives (GNU Elpa)
(unless package-archive-contents

I'm not going to walk through each line of code here, you can do that yourself with the built-in Emacs help system. Use M-x describe-function or M-x describe-variable:

M-x describe-function menu-bar-mode

M-x describe-variable window-resize-pixelwise

Or equivalently,

C-h f menu-bar-mode

C-h v window-resize-pixelwise

It's best to get acquainted with the Emacs help system and learn how to find help within Emacs itself. Later on you'll install vertico and marginalia, two packages that make navigating the minibuffer for commands (like M-x) much more enjoyable.


With those settings out of the way, we're going to install some packages. All of these packages are available on the default Emacs package server, GNU Elpa. If you'd like to configure alternatives, like MELPA, consult the docs.

;; Great looking theme
(use-package modus-themes
  :ensure t
;; Code completion at point
(use-package company
  :ensure t
  :hook (after-init . global-company-mode)
  (company-idle-delay 0))

;; Better minibuffer completion
(use-package vertico
  :ensure t
  (vertico-cycle t)
  (read-buffer-completion-ignore-case t)
  (read-file-name-completion-ignore-case t)
  (completion-styles '(basic substring partial-completion flex))

;; Save minibuffer results
(use-package savehist

;; Show lots of useful stuff in the minibuffer
(use-package marginalia
  :after vertico
  :ensure t

Next steps

Save your configuration file, close and re-open Emacs. Time to experiment!

If you have an LSP server already installed, e.g. solargraph for Ruby, browse to a source file and activate eglot with M-x eglot. You can ensure this happens automatically by adding an eglot-ensure hook to your Emacs configuration:

(use-package eglot
  :ensure t
  :hook (ruby-mode . eglot-ensure))

From here, it's really up to you to explore and learn on your own. Here are some suggestions to help you along:

Thanks for reading! Send your comments to blog@mgmarlow.com.