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.
Top comments (3)
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 :)