A fast, powerful and modular Emacs configuration that favors built-in functionality over third-party packages.
Screenshots · System Crafters Demo · Emacs Version · Optional Dependencies · Installation · Disclaimer · FAQ
This is what you see as soon as you start Emacs:
███████╗███╗ ███╗ █████╗ ██████╗███████╗ ███████╗ ██████╗ ██╗ ██████╗
██╔════╝████╗ ████║██╔══██╗██╔════╝██╔════╝ ██╔════╝██╔═══██╗██║ ██╔═══██╗
█████╗ ██╔████╔██║███████║██║ ███████╗ ███████╗██║ ██║██║ ██║ ██║
██╔══╝ ██║╚██╔╝██║██╔══██║██║ ╚════██║ ╚════██║██║ ██║██║ ██║ ██║
███████╗██║ ╚═╝ ██║██║ ██║╚██████╗███████║ ███████║╚██████╔╝███████╗╚██████╔╝
╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚══════╝ ╚══════╝ ╚═════╝ ╚══════╝ ╚═════╝
Loading time : 0.172725 seconds
Packages : 0
Emacs Solo is a configuration I use when I want to go back to the roots and challenge myself by using Emacs with only built-in features.
It aims to be minimalist, at least in spirit. Yes, there are over 3000 lines of code, but most of that comes from organizing things cleanly and building small, reusable modules. Compared to full-featured distributions, it’s still lean and focused.
The configuration favors Emacs built-ins, configured my way. But when something essential is missing (like margin git gutters), a small, hacky workaround is always added.
Also, check out the full demo of Emacs Solo
in action, as seen on
the System Crafters channel. In this video, David Wilson explores and
learns from the configuration, showing how different settings and
approaches are applied to create a more efficient and personalized
Emacs setup.
Emacs Solo always requires the latest stable release of Emacs, which
is currently: 30.1
However, some bleeding-edge features may be tested as well. For those,
you’ll need to compile Emacs from the master branch. I do my best to
mark these features with the Emacs 31
tag.
It is recommended you have this programs in your system:
ripgrep
(rg)This provides quicker project grep and xref navigation.
If you opt to use regular
grep
, reset the customization of variablegrep-command
.
gls
MacOS comes with an implementation of
ls
that misses some nice switches from the gnu implementation (gls
on homebrew). If you opt to use MacOS defaulls
you might need to change thedired-listing-switches
variable.
curl
Only needed if you’d like to upload text/images directly to 0x0.st site from Emacs Solo, by using either
emacs-solo/0x0-upload-text
oremacs-solo/0x0-upload-file
.Also used for
emacs-solo-weather
.
mpv
Only needed if you’d like to play videos directly from news in
newsticker
, play music from dired with dired music playerC-c m
, play something from a m3u file withm3u-visualize-buffer
or listen to online radio withC-c r
.
rsync
Only needed if you’d like to use
emacs-solo/dired-rsync-copy
.
ollama
Only needed if you’d like to use
emacs-solo/ollama-run-model
.
pbcopy/pbpaste
(macos)wl-copy/wl-paste
(Linux with Wayland)xclip
(Linux with Xorg)In order to proper copy/paste from terminals, you need:
Clone this repository into a directory of your liking and run Emacs with:
emacs --init-directory=YOUR_DIR
You can also simply copy init.el and early-init.el into any folder issue the same command as above
And that’s it, happy hacking! 🐂
I’m happy to share this configuration with a catchy name, and I’d be genuinely delighted if you find it useful. 🙂
However, this is not intended to be a distribution. This means I may not cover every user’s needs, nor will I accept every contribution that pushes it in that direction. I use this configuration daily for both personal and professional work, and like any custom setup, it reflects my own preferences.
For example, this config does not include Python-specific settings, whether for Eglot or Tree-sitter. Since this is a real working setup and I’m not currently using Python, its absence might seem like an oversight.
If you’d like to add your own modifications while staying up to date
with Emacs Solo, simply create a private.el
file in the same directory
as init.el
. A hook is already in place to load this private file after
Emacs initializes.
Of course, you can also fork it! (please do 😊)
A FAQ like session of common questions of how to do X with only Emacs Solo.
The usual answer is M-b to go back to the beginning of the word. C-M-SPC to expand the selection to the end of the word and M-w.
Custom Emacs Solo Solution: Use the isearch way to search a word (it has better completion than C-M-SPC), like M-s M-. you can now just M-w.
Original problem: I usually consult-outline, then embark-collect and wgrep...
You can start by using occur, or using isearch and than moving to occur.
Next start the edit mode of the occur buffer with e.
Make your changes, apply it with C-c C-c
From Emacs 30.1 onward you can also use the combo:
replace-regexp-as-diff
for replacements in a single buffer,
multi-replace-regexp-as-diff
for multiple buffers, and
dired-do-replace-regexp-as-diff
to perform replace-regexp-as-diff
Original problem: I usually consult-grep, then use embark collect and wgrep...
Open dired on the root folder of where you search will happen. Mark some files and or folders with m.
Use dired-do-query-replace-regexp
or in a dired buffer hit Q
.
Confirm it all or one by one, use ? to check the options.
From Emacs 30.1 onward you can also use the combo:
replace-regexp-as-diff
for replacements in a single buffer,
multi-replace-regexp-as-diff
for multiple buffers, and
dired-do-replace-regexp-as-diff
to perform replace-regexp-as-diff
You have two built-in options on Emacs.
M-x gnus
M-x newsticker-treeview
C-x v L
on a file inside your version controlled file. And over the
line you have the commit, press d
for diffing.
If you wanna diff a range, mark the lines starting with C-SPC
on the
first line of the range, and again C-SPC
in the last line of the range
(the content of what you want must be selected, if ther cursor is on
first column of the line it won’t be included), now use d
to diff.
C-x v =
will open the diff panel for the current file, restrict it to
the hunk you’d like to revert with r
, revert the direction of the diff
with R
and apply the diff with C-c C-a
.
From Emacs 31, we also have C-c M-r
(diff-revert-and-kill
), when on
buffers generated by C-x v =
and C-x v D
.
Emacs comes with viper
which is a vi
emulator. This means a lot of
modern editing capabilities are missing.
Take a look at use-package Emacs Solo-viper-extensions
, section of the
init.el
file. Emacs Solo extends viper mode to include a bunch of more
modern evil-like
bindings.
Just give it a try ;) M-x viper-mode
Use the powers of highlight-regexp
! Over a word you want to make
highlighted use M-s h .
You can repeat it to other words and Emacs will handle different colors for you.
To remove a highlight use M-s h u
and select the highlighted regexp on
the list.
Find out about more options regarding highlighting with M-s h ?
.
It is a common thing trying to close Emacs with C-x C-c
just to find
out one of your buffers has some modification and now Emacs asks if
you’d like to save, override, etc.
Emacs Solo provides the extra option d
, which will generate a diff of
the current file being asked to take action, so you can see if saving
is needed.
10.) Show/Hide (toggle) hidden files in Dired?
Use dired-omit-mode
, which you can toggle with C-x M-o
. Notice that
this mode uses the regular expression defined in the dired-omit-files
variable. Emacs Solo already customizes this to ignore files matching
^\\.
Ever felt the need of some multi-term
package on Emacs? Well, you
don’t really need it, at least not with the internal implementations
of terminals and eshell
.
Just use the C-u
unversal argument command before calling your
term/shell, like: C-u M-x eshell
or C-u C-x p e
or C-u M-x term
, and
so on.
Now you have another instance of your term to work with, repeat this pattern if you need more instances.
From Emacs 31, we have after C-x v =
a new C-c RET n
(diff-delete-other-hunks
) option to do so.
From C-x v L
, you can press e
and you’ll be editing the commit
message. This is available from Emacs 31 onward.