I love using Spacemacs. I like how extensible Emacs is, but prefer the modal editing nature of Vi(m), and Spacemacs provides the best of both worlds through the use of Evil. Tinkering with my editor configuration to get the perfect setup is fun, and there are a few ways this can be achieved:
- Use base Emacs with customizations
- Use the full Spacemacs distribution
- Customize the base Spacemacs distribution
Using base Emacs (1) and adding our own packages and configurations is doable but it takes a lot of work. Full Spacemacs (2) offers everything the distribution has to offer, but I find there are packages that I never use, which causes my editor to load/perform slower than it needs to.
I opted for the 3rd option: install the base Spacemacs distribution, then pick and choose specific layers and packages that I need to keep my editor as light as possible. I could’ve just installed the packages separately (instead of going through the layer system) but then I’d lose the ability to integrate the package into the Spacemacs ecosystem without additional configuration of things like keybindings and adding custom functions.
Overall, I don’t mind buying into an opinionated ecosystem like Spacemacs, I just want it to be faster.
Note: The following contains links and code from the Spacemacs GitHub repo. Given Spacemacs is a community driven distribution, the structure of the repo may change at any time. The below is correct as of 14/04/17.
Identifying base packages and layers
We can see the list of packages installed with the base distribution in their GitHub repo:
(setq spacemacs-base-packages '( (abbrev :location built-in) ace-window (archive-mode :location built-in) (bookmark :location built-in) (centered-buffer-mode :location local) (conf-mode :location built-in) (dired :location built-in) (dired-x :location built-in) (electric-indent-mode :location built-in) (ediff :location built-in) (eldoc :location built-in) evil-escape (evil-evilified-state :location local :step pre :protected t) evil-visualstar (exec-path-from-shell :step pre) help-fns+ (hi-lock :location built-in) (holy-mode :location local :step pre) (hybrid-mode :location local :step pre) (image-mode :location built-in) (imenu :location built-in) (linum :location built-in) (occur-mode :location built-in) (package-menu :location built-in) (page-break-lines :location built-in) pcre2el (process-menu :location built-in) projectile (recentf :location built-in) (savehist :location built-in) (saveplace :location built-in) (spacemacs-theme :location built-in) (subword :location built-in) (tar-mode :location built-in) (uniquify :location built-in) (url :location built-in) (visual-line-mode :location built-in) (whitespace :location built-in) (winner :location built-in) ))
When we install the full/standard distribution, some additional layers are added to give us access to more packages. Again, we can see the added layers in their repo:
(configuration-layer/declare-layers '(spacemacs-base spacemacs-completion spacemacs-layouts spacemacs-editing spacemacs-editing-visual spacemacs-evil spacemacs-language spacemacs-misc spacemacs-ui spacemacs-ui-visual spacemacs-org ))
Layers are just groups of Emacs packages with custom functionality added. So, the goal is to look at each of these full distribution layers and figure out which packages we want to extract and use in our own setup.
Of course we can also just install individual packages the “traditional” way by adding it to
dotspacemacs-additional-packages but if the package we want can be found in a Spacemacs layer then it’s preferable (in my opinion) to extract it from the layer system. This way we can retain all of the upstream configurations, keybindings, and custom functions that Spacemacs sets for those packages.
Picking and choosing packages
The best way to figure out which packages to extract is by digging through their GitHub repo to see what each layer contains (along with what additional configurations are used for each layer/package). The Spacemacs layers used in the full distribution can be found here. To see what packages are in each layer, we just dive into the directory for that layer and look at the
Let’s take the
spacemacs-editing layer for example.
packages.el shows the packages used in that layer:
(setq spacemacs-editing-packages '(aggressive-indent avy (bracketed-paste :toggle (version <= emacs-version "25.0.92")) clean-aindent-mode eval-sexp-fu expand-region (hexl :location built-in) hungry-delete link-hint lorem-ipsum move-text (origami :toggle (eq 'origami dotspacemacs-folding-method)) smartparens (spacemacs-whitespace-cleanup :location local) undo-tree uuidgen ws-butler ))
Now that we know what this layer contains, we can choose only the packages we need and add it to our own configuration.
To install packages we need to edit our
~/.spacemacs file, which contains our configuration. Specifically, we’re looking for the
dotspacemacs/layers() function. Inside, you’ll see
dotspacemacs-configuration-layers which is where we’d typically install entire layers, but we can use this to install specific packages from a layer as well.
So let’s say we only want to use the
smartparens packages from this layer. We simply specify those packages in
(defun dotspacemacs/layers () (setq-default dotspacemacs-configuration-layers '((spacemacs-editing :packages avy smartparens)) ))
If we want to add an entire Spacemacs layer (
spacemacs-xxx) or any other layer in the their ecosystem (e.g.
html), we add them to the same place. Furthermore, we can pick and choose packages from any of those additional layers as well (e.g.
rainbow-mode from the
(defun dotspacemacs/layers () (setq-default dotspacemacs-configuration-layers '((colors :packages rainbow-mode) git helm html (spacemacs-editing :packages avy smartparens) (spacemacs-editing-visual :packages auto-highlight-symbol highlight-parentheses indent-guide) spacemacs-layouts spacemacs-org) ))
Spacemacs offers a nice ecosystem, and in my mind the best way to customize the distribution is by installing spacemacs-base and then flexibly picking desired packages from within their layer system.
This gives the advantage of customizing the editor with only the packages that I want and need, while still retaining all of the upstream configurations for each of those packages so I can avoid configuring them manually. Of course, this has the disadvantage of your configuration breaking if they rename their
spacemacs-xxx layers, or decide to remove a package from a particular layer, but this seems like a small price to pay for the flexibility and performance increases that can be gained.