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 : 0Emacs 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.
Use M-x customize-group emacs-solo RET.
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.
ghostscriptThis is necessary if you want to be able to use
doc-viewto see documents like PDFs.
glsMacOS comes with an implementation of
lsthat misses some nice switches from the gnu implementation (glson homebrew). If you opt to use MacOS defaullsyou might need to change thedired-listing-switchesvariable.
curlOnly needed if you’d like to upload text/images directly to 0x0.st site from Emacs Solo, by using either
emacs-solo/0x0-upload-textoremacs-solo/0x0-upload-file.Also used for
emacs-solo-weatherandemacs-solo-rate.wgetIf present on the system, emacs-solo
newstickerconfig uses it instead of the internal fetcher.mpvOnly 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-bufferor listen to online radio withC-c r.
rsyncOnly needed if you’d like to use
emacs-solo/dired-rsync-copy.
ollamaOnly needed if you’d like to use
emacs-solo/ollama-run-model.gemmini-cliOnly needed if you’d like to use
emacs-solo/gemini-run-model.khardOnly needed if you’d like to use
emacs-solo/khard-...funcitons.
In order to proper copy/paste from terminals (TUI), you need:
pbcopy/pbpaste(macos)wl-copy/wl-paste(Linux with Wayland)xclip(Linux with Xorg)
Clone this repository into a directory of your liking and run Emacs with:
emacs --init-directory=YOUR_DIRYou 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 gnusM-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.
From C-x v v, you can press C-c C-e and you’ll be on ‘amend’ mode.
Only the current buffer:
C-x C--
C-x C-+ / C-x C-=
C-x C-0
The whole interface:
C-x C-M--
C-x C-M-+ / C-x C-M-
C-x C-M-0
With global-goto-address-mode turned on, you can C-c RET over a link
to open it on your default browser.
C-u C-c RET will open it on secundary browser, recommended:
Emacs Solo defaults:
(setq global-goto-address-mode t)
(setq browse-url-secondary-browser-function 'eww-browse-url)The doc-view-resolution variable is the way to go.
Given global-goto-address-mode is set to t, we can C-c RET to url
under point. This will use your system default browser.
If you’d like to use EWW and never leave Emacs, simply set
browse-url-secondary-browser-function to 'eww-browse-url. This way you
can C-u C-c RET.
Use C-x f and then M-n to get the path under point fed to file-find.
Usually C-x k kills a buffer, but it keeps the window opened. If you
wish to kill and close window, use C-x 4 0 (kill-buffer-and-window).
