___ ___ ___ ___ ___ ___ ___ / /\ /__/\ / /\ /__/\ / /\ / /\ / /\ / /:/ \ \:\ / /:/_ | |::\ / /::\ / /:/ / /:/_ / /:/ \__\:\ / /:/ /\ | |:|:\ / /:/\:\ / /:/ / /:/ /\ / /:/ ___ ___ / /::\ / /:/ /:/_ __|__|:|\:\ / /:/~/::\ / /:/ ___ / /:/ /::\ /__/:/ / /\ /__/\ /:/\:\ /__/:/ /:/ /\ /__/::::| \:\ /__/:/ /:/\:\ /__/:/ / /\ /__/:/ /:/\:\ \ \:\ / /:/ \ \:\/:/__\/ \ \:\/:/ /:/ \ \:\~~\__\/ \ \:\/:/__\/ \ \:\ / /:/ \ \:\/:/~/:/ \ \:\ /:/ \ \::/ \ \::/ /:/ \ \:\ \ \::/ \ \:\ /:/ \ \2.0 /:/ \ \:\/:/ \ \:\ \ \:\/:/ \ \:\ \ \:\ \ \:\/:/ \__\/ /:/ \ \::/ \ \:\ \ \::/ \ \:\ \ \:\ \ \::/ /__/:/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ 222222222222222 2:::::::::::::::22 2::::::222222:::::2 2222222 2:::::2 2:::::2 2:::::2 2222::::2 22222::::::22 22::::::::222 2:::::22222 2:::::2 2:::::2 2:::::2 222222 2::::::2222222:::::2 2::::::::::::::::::2 22222222222222222222
This version 2 of Chemacs is a work in progress, it introduces necessary breaking changes to be able to support early-init.el, and may not yet work out of the box without some extra effort. For a solid, stable version head see the “classic” Chemacs 1.
Chemacs 2 is an Emacs profile switcher, it makes it easy to run multiple Emacs configurations side by side.
Think of it as a bootloader for Emacs.
Emacs configuration is either kept in a
~/.emacs file or, more commonly, in a
~/.emacs.d directory. These paths are hard-coded. If you want to try out someone else’s configuration, or run different distributions like Prelude or Spacemacs, then you either need to swap out
~/.emacs.d, or run Emacs with a different
$HOME directory set.
This last approach is quite common, but has some real drawbacks, since now packages will no longer know where your actual home directory is.
All of these makes trying out different Emacs configurations and distributions needlessly cumbersome.
Various approaches to solving this have been floated over the years. There’s an Emacs patch around that adds an extra command line option, and various examples of how to add a command line option in userspace from Emacs Lisp.
Chemacs tries to implement this idea in a user-friendly way, taking care of the various edge cases and use cases that come up.
Clone the Chemacs 2 repository as
$HOME/.emacs.d. Note that if you already have an Emacs setup in
~/.emacs.d you need to move it out of the way first. If you have an
~/.emacs startup script then move that out of the way as well.
[ -f ~/.emacs ] && mv ~/.emacs ~/.emacs.bak [ -d ~/.emacs.d ] && mv ~/.emacs.d ~/.emacs.default git clone https://github.com/plexus/chemacs2.git ~/.emacs.d
Note that this is different from Chemacs 1. Before Chemacs installed itself as
~/.emacs and you could have your own default setup in
~/.emacs.d. This approach no longer works because of
~/.emacs.d/early-init.el, so Chemacs 2 needs to be installed as
Next you will need to create a
~/.emacs-profiles.el file, for details see below.
(("default" . ((user-emacs-directory . "~/.emacs.default"))))
Chemacs adds an extra command line option to Emacs,
--with-profile. Profiles are configured in
If no profile is given at the command line then the
default profile is used.
$ emacs --with-profile my-profile
This file contains an association list, with the keys/cars being the profile names, and the values/cdrs their configuration.
The main thing to configure is the
(("default" . ((user-emacs-directory . "~/.emacs.default"))) ("spacemacs" . ((user-emacs-directory . "~/spacemacs"))))
Chemacs will set this to be the
user-emacs-directory in use, and load
init.el from that directory.
Other things you can configure
custom-file: The file where Customize stores its customizations. If this isn’t configured, and the
custom-filevariable is still unset after loading the profile’s
init.el, then this will get set to the profile’s
server-name: Sets the
server-namevariable, so you can distinguish multiple instances with
emacsclient -s <server-name>.
envAn association list of environment variables. These will get set before loading the profile, so they can influence the initialization, and they are visible to any subprocesses spawned from Emacs.
straight-pEnable the Straight functional package manager.
.emacs-profiles.el together with your dotfiles. If you’re not yet keeping a version controlled directory of dotfiles, then check out connect-the-dots for a helpful script to do that.
Changing the default profile (e.g. for GUI editors)
Where it is not possible to use the
--with-profile flag, the default profile can be set using a
~/.emacs-profiles.el file contains the following:
(("default" . ((user-emacs-directory . "~/.emacs.default"))) ("spacemacs" . ((user-emacs-directory . "~/spacemacs"))) ("prelude" . ((user-emacs-directory . "~/prelude"))))
you can create a file called
~/.emacs-profile, containing the name of the profile you’d like to be used when none is given on the command line:
$ echo 'spacemacs' > ~/.emacs-profile
This will set the default profile to be the “spacemacs” profile, instead of “default”. You can change the default by simply changing the contents of this file:
$ echo 'prelude' > ~/.emacs-profile
If this file doesn’t exist, then “default” will be used, as before.
Spacemacs is typically installed by cloning the Spacemacs repo to
~/.emacs.d, and doing extra customization from
~/.spacemacs.d/init.el. This makes it tedious to switch between version of Spacemacs, or between different Spacemacs configurations.
With Chemacs you can point your
user-emacs-directory to wherever you have Spacemacs installed, and use the
SPACEMACSDIR environment variable to point at a directory with customizations that are applied on top of the base install.
(("spacemacs" . ((user-emacs-directory . "~/spacemacs") (env . (("SPACEMACSDIR" . "~/.spacemacs.d"))))) ("spacemacs-develop" . ((user-emacs-directory . "~/spacemacs/develop") (env . (("SPACEMACSDIR" . "~/.spacemacs.d"))))) ("new-config" . ((user-emacs-directory . "~/spacemacs/develop") (env . (("SPACEMACSDIR" . "~/my-spacemacs-config"))))))
You can add an entry similar to the following to your
In the following snippet
~/doom-emacs is where you have cloned doom emacs.
(Depending on when you read this)
DOOMDIR support is only in
develop branch of doom emacs. Check commit history of
master branch of doom emacs
("doom" . ((user-emacs-directory . "~/doom-emacs") (env . (("DOOMDIR" . "~/doom-config")))))
Please refer to this discussion for details.
Copyright © Arne Brasseur 2018-2020
Distributed under the terms of the GPL v3.