loading...

Emacs from scratch

huytd profile image Huy Tr. ・4 min read

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:

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

Files:
  SPC p f   : find files

Buffers:
  SPC b b   : buffers list

Window:
  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

Other:
  SPC a t   : open terminal in the current buffer

Configuration file

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

$ mkdir -p ~/.emacs.d
$ touch ~/.emacs.d/init.el

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
has.

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)

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"   . "http://orgmode.org/elpa/")
                         ("gnu"   . "http://elpa.gnu.org/packages/")
                         ("melpa" . "https://melpa.org/packages/")))
(package-initialize)

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
tidy.

;; Bootstrap `use-package`
(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))
(require 'use-package)

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
  :config
  (evil-mode 1))

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
  :config
  (load-theme 'doom-one t))

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
matching
:

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

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
  :init
  (setq which-key-separator " ")
  (setq which-key-prefix-prefix "+")
  :config
  (which-key-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")
))

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)

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
line,...

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
here
.

Posted on by:

huytd profile

Huy Tr.

@huytd

Write code, drawing things

Discussion

pic
Editor guide
 

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!

 

Awesome post, I also saw your post at huytd.github.io/emacs-from-scratch...

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

Thank you.

 

Great article, you should write more.

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