DEV Community

Huy Tr.
Huy Tr.

Posted on

Emacs from scratch

Original posted on my blog

Spacemacs is the first Emacs version I used, so I'm kind of attached to
the evil-mode and SPC mnemonic key binding.

But I always have a feeling that something is not right, Spacemacs hides
a lot of things under the hood, and it loads a lot of stuff that I do
not need during the startup. This would be a huge waste, and I need to
have a fresh setup that I can control every single thing in my editor.

So I created my own Emacs configuration, it's surprisingly easier than
as I thought.

In this post, I'll go through the steps I built a minimal
Spacemacs-like version, with some basic key binding:

  SPC /     : ripgrep
  SPC TAB   : previous buffer
  SPC SPC   : Open M-x

  SPC p f   : find files

  SPC b b   : buffers list

  SPC w l   : move right
  SPC w h   : move left 
  SPC w j   : move down
  SPC w k   : move up
  SPC w /   : split right
  SPC w -   : split bottom
  SPC w x   : close window

  SPC a t   : open terminal in the current buffer
Enter fullscreen mode Exit fullscreen mode

Configuration file

First, we need to create a init.el file:

$ mkdir -p ~/.emacs.d
$ touch ~/.emacs.d/init.el
Enter fullscreen mode Exit fullscreen mode

Now, Emacs will start with the ugly tools bar and status bar, just like
any editor that I would uninstall right away. Let's change this.

Minimal UI

Now, we need to disable all the ugly stuff and make Emacs just as clean
and clear as Vim or Sublime, Atom,... or whatever modern editor today

Put these to the beginning of your init.el:

;; Minimal UI
(scroll-bar-mode -1)
(tool-bar-mode   -1)
(tooltip-mode    -1)
(menu-bar-mode   -1)
Enter fullscreen mode Exit fullscreen mode

Next, we'll add a package manager to start installing themes/packages.

Package Manager

By default, Emacs is configured to use ELPA package archive, we'll
need to add more repository such as GNU ELPA, MELPA,...

Put this to the beginning of your init.el:

;; Package configs
(require 'package)
(setq package-enable-at-startup nil)
(setq package-archives '(("org"   . "")
                         ("gnu"   . "")
                         ("melpa" . "")))
Enter fullscreen mode Exit fullscreen mode

Next, we'll use use-package
to configure our packages better, in case you don't know, this package
provides a macro to allow you to easily install packages and isolate
package configuration in a way that is both performance-oriented and

;; Bootstrap `use-package`
(unless (package-installed-p 'use-package)
  (package-install 'use-package))
(require 'use-package)
Enter fullscreen mode Exit fullscreen mode

Vim key binding with Evil Mode

Now that you have package manager setted up, let's install our first
package: evil-mode, this package allows you to use Vim-like key
binding in Emacs.

;; Vim mode
(use-package evil
  :ensure t
  (evil-mode 1))
Enter fullscreen mode Exit fullscreen mode

That's it! Now restart your Emacs, you'll see the mode line displaying
the current Vim mode, and you'll be able to navigate with hjkl.

Installing Theme

One of the best themes for Emacs I could found is doom-themes package,
that has a lot of cool themes. The following code will install this
package and load its flagship theme doom-one:

;; Theme
(use-package doom-themes
  :ensure t
  (load-theme 'doom-one t))
Enter fullscreen mode Exit fullscreen mode

Installing Helm

Helm is a framework for
incremental completions and narrowing selections in Emacs. Many people
prefer ivy because it's much lighter, for me, it's doesn't matter.
I find helm is easier to use and config.

The following snippet will install helm and configure fuzzy

;; Helm
(use-package helm
  :ensure t
  (setq helm-mode-fuzzy-match t)
  (setq helm-completion-in-region-fuzzy-match t)
  (setq helm-candidate-number-list 50))
Enter fullscreen mode Exit fullscreen mode

Installing Which Key

In Spacemacs, when you press SPC or any other key sequence, a small
buffer will be popped up to show the list of features you can do next,
installing which-key will give you this.

;; Which Key
(use-package which-key
  :ensure t
  (setq which-key-separator " ")
  (setq which-key-prefix-prefix "+")
Enter fullscreen mode Exit fullscreen mode

Custom Key Binding

Finally, you can start config your custom key binding with general
package, this is my config, the prefix is SPC just like in Spacemacs:

;; Custom keybinding
(use-package general
  :ensure t
  :config (general-define-key
  :states '(normal visual insert emacs)
  :prefix "SPC"
  :non-normal-prefix "M-SPC"
  ;; "/"   '(counsel-rg :which-key "ripgrep") ; You'll need counsel package for this
  "TAB" '(switch-to-prev-buffer :which-key "previous buffer")
  "SPC" '(helm-M-x :which-key "M-x")
  "pf"  '(helm-find-file :which-key "find files")
  ;; Buffers
  "bb"  '(helm-buffers-list :which-key "buffers list")
  ;; Window
  "wl"  '(windmove-right :which-key "move right")
  "wh"  '(windmove-left :which-key "move left")
  "wk"  '(windmove-up :which-key "move up")
  "wj"  '(windmove-down :which-key "move bottom")
  "w/"  '(split-window-right :which-key "split right")
  "w-"  '(split-window-below :which-key "split bottom")
  "wx"  '(delete-window :which-key "delete window")
  ;; Others
  "at"  '(ansi-term :which-key "open terminal")
Enter fullscreen mode Exit fullscreen mode

Matching Titlebar color on MacOS

If you're using Emacs on macOS, you can add this to have your titlebar
color changed and matching your color theme:

;; Fancy titlebar for MacOS
(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
(add-to-list 'default-frame-alist '(ns-appearance . dark))
(setq ns-use-proxy-icon  nil)
(setq frame-title-format nil)
Enter fullscreen mode Exit fullscreen mode

From here, you can continue customizing Emacs as you need, for example,
add projectile package for
project management, add more language supports, customize your mode

I hope you'll find this post helpful and will be able to build your own
Emacs configuration. Also, you can check my customized configuration

Top comments (3)

alexcooperdev profile image
Alex Cooper

This is awesome! I used Spacemacs a while back, and I didn't love how complicated some things were, and I never quite got the hang of configuring emacs from scratch. I threw this into my init.el along with some stuff I had configured myself. I'm already inputting some of my own preferred Spacemacs commands.

Thanks for this!

lucasprag profile image

Awesome post, I also saw your post at

I'm studying emacs and your post helped me a lot. Please consider post more about emacs.

Thank you.

msal profile image
Mohammed Salman

Great article, you should write more.

Also, I liked your blog. The implementation is amazing and simple, plus your content is worth reading :)