7 ms·
Two Years of Emacs Solo
- wilkystyle 7mo ago> That means the code is sketchy sometimes, sure, but it's in my control. I wrote it, I understand it, and when it breaks, I know exactly where to look. This resonates with me so hard. I'm not a "no external packages" purist, but there are a number of pieces of functionality that I wrote for myself because there wasn't anything quite like what I wanted. One example is a function to expand the region (selection) to any arbitrary set of pairing delimiters that I define in a defvar (parens, quotes, brackets, or I can can supply a custom left/right regex for matching). Then, when I execute the function, it waits for a second keypress, which is the trigger key I've defined for that matching pair, and it will expand the region to the left and the right until it meets the applicable delimiter. Repeating the same key presses results in selecting the left and right delimiters themselves, and another repeat will extend to the next set of matching delimiters, and so on. Even though I use a treesitter-based expand-region plug-in, my custom function is still invaluable for when I want to jump past a series of valid treesitter object expansions, or when certain text objects are just not defined in treesitter. Some of the helpful custom expansions I have defined are: "w" to select what Vim considers a lowercase-w word Space to select what Vim considers an uppercase-W word "$" to select ${...}-style expressions "/" to select everything between forward slashes "*" to select between asterisks (useful when editing markdown) It's really an invaluable function for me, personally, but I always talk myself out of trying to open-source it because it has some gotchas and limitations, and I just don't want to be on the hook for trying to make everyone who uses it happy.
- throwaway27448 7mo ago> "w" to select what Vim considers a lowercase-w word ?!? Wtf does this mean and how did vi come up
- keithnz 7mo agovim has two "word" motions, w and W, the lowercase w motion will see punctuation as a word boundary (as well as whitespace ) W only considers whitespace
- throwaway27448 7mo agoSure. how was that relevant to explaining their keymapping? Why would you not simply directly describe the behavior as you did rather than sending the same amount of energy to route people through an entirely unrelated editing paradigm?
- bluebarbet 7mo agoMind blown. Now I'm wondering if swapping `w` and `W` in the config is worth the penalty of diverging from the defaults. Decisions decisions.
- dhosek 7mo agoBecause any mention of Emacs must bring out the vi people, just as any mention of vi must bring out the Emacs people. Because you people are cracking your eggs from the wrong end!
- rkomorn 7mo ago> Because you people are cracking your eggs from the wrong end! That's because both ends are wrong. Eggs should be cracked from the side. Can't believe this still needs to be said on this forum in 2026.
- drob518 7mo agoCue RMS giving the Church of Emacs skit…
- throwaway27448 7mo ago> Can't believe this still needs to be said on this forum in 2026. And we still don't have a usable editor outside of emacs
- yunnpp 7mo agoIs Eglot on par with emacs-lsp for C++? Specifically thinking about pointing it to a compile_commands.json and all of the usual C++ nonsense required for code navigation and autocomplete.
- Ferret7446 7mo agoThe UX will be different and is a matter of preference. The performance depends solely on your LSP. So long as your LSP is the same and configured the same, it will give you the same results for navigation/completion.
- internet_points 7mo agoI use it that way. It requires less setup than lsp-mode. Just try it – add `:disabled t` to your use-package lsp-mode, restart emacs and type `M-x eglot` in a C++ buffer.
- gpderetta 7mo agoPretty much yes. I switched to eglot from emacs-lsp because of some frequent random errors ("document not added") that required me to frequently kill clangd; might be a PEBCAK problem, but went away with eglot. Everything mostly worked out of the box.
- hirvi74 7mo agoThis might be a paragon of masochism. Though, I am not only beyond impressed. I am beyond jealous as well. I've been using Emacs since one of professors/mentors converted me over a decade ago back when I was attending university. As the years have progressed, I have found myself reaching for Emacs less and less. I still maintain my config and use it fairly often. I cannot use Emacs at my employer either, so that doesn't help. However, I have always wanted to do what the author has demonstrated. I would love to be liberated from the all package dependencies I currently have. I just do not have the time nor self-discipline to do something like this. Even if the functionality would be less than or equal parity with 3rd-party packages, I would prefer the Devil I know over the ones I don't.
- fedreg 7mo agosuper impressive!! Going to steal some of this lisp for sure
- throwaway27448 7mo agoWhy are we so bad at naming things? Modules and packages are so abstract I need to google what they mean relative to the development environment just to move forward.
- InMice 7mo agoThat's the beauty of open source
- Ferret7446 7mo agoThe "why" is kinda sketchy. The difference between what is shipped in Emacs and in ELPA is somewhat arbitrary. In fact, there are many built in packages that have their updates shipped in ELPA, meaning if you aren't using ELPA then your builtin packages might have unpatched bugs. There's also no reason why you have to literally write everything yourself either. You can find open source licensed packages, read them to understand them, and then copy them into your config. Doing everything from scratch is a waste of time unless you enjoy the process (in which case go nuts). It's roughly equivalent to trying to discover all of our scientific knowledge yourself from scratch vs taking "for granted" the knowledge discovered by your forebears. There is no shame or disadvantage in doing so. Also, a critical objection: > Writing your own packages is the best way to learn Elisp Absolutely not. Reading a language is crucial. If all you do is write, you will pigeonhole into weird practices and generally fail to improve. Only by reading stuff written by others can you learn, as you're exposed to what other people do right and wrong, both of which will be different from you. Of course, writing your own packages is also necessary, but not sufficient alone.
- skydhash 7mo ago> There's also no reason why you have to literally write everything yourself either. > It's roughly equivalent to trying to discover all of our scientific knowledge yourself from scratch vs taking "for granted" the knowledge discovered by your forebears. The author do have another config with all the bells and whistles. But Emacs does come with a lot of packages and tweaking them isn't that much work compared to building a full suite like Helm, especially with the awesome documentation system. Getting a v0.x of anything can be a matter of minutes. And then you wake up one day and you've built a whole OS for your workflows.
- porcoda 7mo ago> Absolutely not. Reading a language is crucial. I don't think the post implied that this package writing activity was a write-only activity where reading and learning is strictly forbidden. > You can find open source licensed packages, read them to understand them, and then copy them into your config. Doing everything from scratch is a waste of time unless you enjoy the process (in which case go nuts). The post clearly indicates the relatively large set of open source packages they looked at and understood before doing their own packages. The author graciously acknowledges them and their influence on the work: "Emacs Solo doesn't install external packages, it is deeply influenced by them. diff-hl, ace-window, olivetti, doom-modeline, exec-path-from-shell, eldoc-box, rainbow-delimiters, sudo-edit, and many others showed me what was possible and set the bar for what a good Emacs experience looks like. Where specific credit is due, it's noted in the source code itself."
- gyrgtyn 7mo agoThe only reason I'm still using emacs is magit (and muscle memory). I could not make magit myself.
- asymmetric 7mo agoFor me it’s org-mode. Although now that I think of it, there’s a Neovim implementation I’ve been meaning to try.
- lvass 7mo agoThis is beautiful, incredibly sane, and awesome reference material. There's no way I'd use a 3500 lines init.el or most of the extras, but somehow I feel like a good chunk of the stuff here should be upstreamed if we one day consider it reasonable to change default behaviors in a major update.
- coolcoder9520 7mo ago[flagged]
- bananamogul 7mo agoIf I was going to reimplement Emacs it wouldn't be with Lisp. Is there some reason Lisp is superior to any other general-purpose programming language for text editing? I'm skeptical because to my knowledge, Emacs is the only major text editor written in Lisp.
- spudlyo 7mo agoIt's a product of its time. In the mid 70s when Emacs was originally created, the MIT Lisp Machine Project had already been going for a few years, and Lisp was kind of a big deal at MIT's AI Lab, where it was created. When Stallman started GNU Emacs in '85 or so, he took lots of inspiration from Lisp and those systems. You can think of Emacs as a kind of software Lisp machine with an emphasis on editing. Although that analogy only works well if you squint or if you don't know a lot about Lisp machines. As someone who first learned Lisp through Emacs Lisp, I found it fun, well-documented, and powerful. Once you grok the basics of how the system is dynamically glued together, infinitely hackable, and self-documenting it's kind of mind-blowing.
- beepbooptheory 7mo agoLisp calls c in emacs. What would be a better language? The code-as-data, data-as-code paradigm fits nicely imo with everything-is-a-buffer. Things like global namespace, hooks, defadvice, would all feel very wrong in other interpreter, and yet seem to make sense in elisp.
- sunng 7mo agoEmacs is like a minecraft of lisp expressions.
- jimbokun 7mo agoBut if you were implementing it in 1976 you would have.
- pkal 7mo agoBut in 1976 Emacs was implemented in TECO. In 1984 it was implemented in Lisp, because Multics Emacs _or_ EINE/ZWEI (Lisp Machine editors) were using Lisp as an extension language, which apparently has shown itself to be useful.
- iJohnDoe 7mo agoThis guy Emacs! In all seriousness very impressive and cool. Great information and post.
- jimbokun 7mo agoThis article shows how Emacs remains a beautiful, relevant project several decades after it was first created. The core design and implementation’s ability to evolve into something still useful today and competitive with modern tools is an amazing achievement. Also, with LLMs driving so much of current development it potentially makes Emacs even more competitive relative to modern IDEs. Development can be driven primarily by an agent like Claude Code from the command line, then navigating and tweaking the code, handling Git commits, etc with Emacs. I imagine an LLM would be very good at writing Elisp to leverage EMacs’ strong core functionality to make Emacs work exactly how you want. This author managed to do it by hand, but I imagine someone starting now with an LLM could get there much faster.
- widdershins 7mo ago> I imagine an LLM would be very good at writing Elisp to leverage EMacs’ strong core functionality Yes, they are pretty good. I have set up GPTel (an excellent Emacs package for interacting with LLMs) with some tools allowing it to run Elisp, inspect files (Elisp functions know what file they were defined in, so it's easy to find stuff) and read Emacs documentation. LLMs use this to good effect, and iterate on my config very nicely.
- pqs 7mo agoIndeed. I always used Emacs, but not, thanks to AI agents, Emacs is better than ever, as it can write the lisp I can't write, and it can read the docs I don't have the time to read.
- uncletaco 7mo agoIt’s interesting how your comment did not talk about anything that’s unique to emacs.
- rgoulter 7mo agoThe core of it is described by the post you're replying to as "I imagine an LLM would be very good at writing Elisp to leverage EMacs’ strong core functionality to make Emacs work exactly how you want." Emacs is highly customisable. There's not really a hard difference between "configuration" and "extension". Whereas with e.g. VSCode, very few people would write their own extensions. -- So it's a good point that with LLMs, the barrier to customise Emacs to exactly how you want it is even lower. I'd also argue that since practically everything in Emacs is text (as opposed to a rich GUI interface), Emacs itself ought to make for a nice interface to LLM functionality.
- NetOpWibby 7mo agoI’m always impressed by people who are hardcore EMacs or Vim devs, their setups are impressive af. I’m a GUI guy though. As soon as I try delving in, I abort when I see things like “just type c-C dingle bob to do x thing.” I’m happy these people found something that works with their brains. I just want a GUI that works like what they use. I recently saw a Zed fork stripped of AI stuff but there’s no binaries yet (you gotta compile and get an Apple dev account and I don’t care enough). Zed and Sublime Text are the closest to my stylistic sensibilities but I’m always on the lookout for something better. If you’re one of these EMacs freaks who also love GUIs, sign me up to your app!
- thunfischbrot 7mo agoThe Zed fork sounds interesting! What was the Apple Dev account needed for? Previously I remember it was only needed for submitting apps to the App Store, not running Dev builds locally.
- NetOpWibby 7mo agoLast I checked it was just to notarize the app but I went back to the fork to remember and now there are binaries! https://codeberg.org/GramEditor/gram https://codeberg.org/GramEditor/gram
- yoyohello13 7mo ago> I just want a GUI that works like what they use. I don't think this is really possible. The thing that makes it special is that there are key binds for all the 100s of things you could want to do. So it becomes sort of like playing a instrument where you use your muscle memory instead of thinking specifically about the keys. If you make a bunch of menus and buttons to do the things it would be a mess and probably not very nice to use. Emacs actually has buttons and GUI controls for lots of the functionality, but it kind of sucks to use it that way. These setups are impressive specifically because the creator has put in the time and effort to become an expert at using their editor. There is just no way to hand that over to someone else as-is without any investment from the recipient in skill development.
- 7mo ago
- k_bx 7mo ago> — Sensible file handling: backups and auto-saves in a cache/ directory, recentf for recent files, clean buffer naming with uniquify It's crazy to me how out of the box when you edit nginx file at /etc/nginx/sites-enabled/foo it creates another file foo~ there and nginx tries to load that too When I tried to ask emacs reddit community they started attacking me for changing the default that only I need and fits everyone perfectly. Still can't believe I'm the only one finding that default amazingly bad.
- baby 7mo agoI raise you my .DS_store
- alwillis 7mo agoIn a terminal on macOS, to disable writing .DS_Store files to network file shares: defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE And for removable media: defaults write com.apple.desktopservices DSDontWriteUSBStores -bool TRUE
- e40 7mo agoBeen using gnu emacs since the 80s and it’s one of the first things I changed. Did you figure it out? If not I can dig up the answer tomorrow.
- qazxcvbnm 7mo agoThe new Emacs features sound great! (We have native window management finally) I wish we would someday be able to edit in xref too, wgrep having landed in Emacs 30 (especially since project.el grep goes to xref by default). By the way, anyone more informed know about any work on getting a graphical browser to work on latest Emacs, now that webkit xwidgets is dead for Emacs 30+? (Have tried EAF; extremely buggy on Mac)
- jharsman 7mo agoEmacs solo actually contains functionality for just that, the below snippet which allows exporting xref buffers to grep format by pressing 'E'. You can then use wgrep etc. ;; Makes any xref buffer "exportable" to a grep buffer with "E" so you can edit it with "e". (defun emacs-solo/xref-to-grep-compilation () "Export the current Xref results to a grep-like buffer (Emacs 30+)." (interactive) (unless (derived-mode-p 'xref--xref-buffer-mode) (user-error "Not in an Xref buffer")) (let* ((items (and (boundp 'xref--fetcher) (funcall xref--fetcher))) (buf-name "*xref→grep*") (grep-buf (get-buffer-create buf-name))) (unless items (user-error "No xref items found")) (with-current-buffer grep-buf (let ((inhibit-read-only t)) (erase-buffer) (insert (format "-*- mode: grep; default-directory: %S -*-\n\n" default-directory)) (dolist (item items) (let* ((loc (xref-item-location item)) (file (xref-file-location-file loc)) (line (xref-file-location-line loc)) (summary (xref-item-summary item))) (insert (format "%s:%d:%s\n" file line summary))))) (grep-mode)) (pop-to-buffer grep-buf))) (with-eval-after-load 'xref (define-key xref--xref-buffer-mode-map (kbd "E") #'emacs-solo/xref-to-grep-compilation))
- qazxcvbnm 7mo agoMy goodness, how so thoughtful Emacs Solo is!
- shevy-java 7mo agoPoor guy - stuck with lisp on an ancient operating system ... And no - vim isn't any better either. I always felt that in the emacs-versus-vim debate there were two losing sides.
- Antibabelic 7mo agoPerhaps these poor guys possess a secret wealth beyond your wildest imagination. I wouldn't give up Emacs for anything.
- gpderetta 7mo ago"a weapon from a more civilized age".
- vincent-manis 7mo agoI agree with you. Edlin forever!!!
- deleted 7mo ago[deleted]
- CodeCompost 7mo agoEmacs is awesome but customizing it costs me way too much of my precious time.
- drob518 7mo agoYep, me too. That’s the eternal trade-off. I’m always pretty sure that there’s a specific Emacs function or mode that does exactly what I want, but I mostly can’t be bothered to find it beyond a quick guessing search via apropos (C-h a). I brute-force my way through a lot of tasks using keyboard macros that might otherwise be solved more elegantly if I had the time.
- internet_points 7mo agoThis was a beautiful article; the joy of tinkering just shines through everywhere :-) I'm glad Rahul did the work to upstream some of the changes, I hope some of the maintainers read his post and are inspired to change a few defaults too (with that init.el vs `lisp/` refactor it should be easier for them to see what wants changing). Maybe some of the packages might provide for inspiration too; I'd love to see vc-mode provide builtin gutter support, for example. And viper extensions sounds like something that should just be upstreamed. (Less so exchange rates and weather.) Emacs is so close to being quite good out-of-the-box.
- jamespo 7mo agoBeing able to sudo edit inside emacs via tramp is something I've only recently discovered and I've being using emacs for years...
- kidsil 7mo agoFunny, this mirrors almost exactly a decision I made after about a year of struggling with ELPA packages breaking on me repeatedly. I ended up cutting Emacs off from ELPA entirely, settled on a ~700-line init.el, and now use Emacs as a glorified Org-mode agenda keeper. It's been heavenly (especially with a dedicated monitor). The one thing I'm still working out is syncing with calendars and email.
- drob518 7mo agoInteresting. I use ELPA/MELPA all the time and find things pretty stable for my own uses. Surprisingly so, in fact. I honestly expected more hiccups. I wonder whether it’s differences between the packages that we use or the complexity of the configuration or what. Mostly I spend my time in Clojure mode with CIDER and Magit. I’m not trying to run email and calendar in Emacs.
- timonoko 7mo agoI tried (setq backup-directory-alist '(("." . ".local/share/Trash/files/"))). It would have been fun if backup files were also Thunar Trash. But too many problems. Even Grok, Gemini and Chatgpt were stunned.
- obezyian 7mo ago> Disabling C-z (suspend) because accidentally suspending Emacs in a terminal is never fun This reminds me of a story from a past job. I have to get it out of my system. There was this bearded sysadmin guy who was very proud of his "15 years of experience", and was quick to scold us new employees for every little thing he could. He used vim, and every now and then would say that it's a good editor, but kinda "unstable". Crashed a lot, he said. You probably know where this is going. One day, one of us sat next to him and discovered many suspended vim jobs in his shell (this was the kind of guy that doesn't power off his computer). He was fat-fingering C-z all the time, and has never heard of job control - bg, fg, etc. 15 years of experience.
- dsr_ 7mo agoSometimes it's 15 repetitions of one year.
- raverbashing 7mo agoInteresting story, but I'm surprised the OP would disable Cmd-z because that is used all the time with vim I know you might prefer to run a shell on emacs (or vim) but something only the full terminal can do what you need it to do
- MonkeyClub 7mo ago> but something only the full terminal can do what you need it to do There's always `M-x term` for a full terminal.
- bergheim 7mo agoGreat stuff. Funny how that whole Ai thing is Ai generated: No gptel, no ellama, just url-retrieve and some JSON parsing. The no x no y just z is the new em dashes. And that will probably be true for about a week.
- NetMageSCW 7mo agoUnjustified huge assumption by someone who has AI living free in their head incoming!
- otsaloma 7mo ago> Partly because I wanted my config to survive without breakage across Emacs releases. Partly because I was tired of dealing with package repositories, mirrors going down in the middle of the workday, native compilation hiccups, and the inevitable downtime when something changed somewhere upstream and my job suddenly became debugging my very long (at the time) config instead of doing actual work. Picking on this detail, what I've found works nicely is that when a new major Emacs version flows into my Debian, I also update all packages to their latest versions and then freeze those versions until the next major Emacs release. And those versions are locked in my emacs.d git repo, so I have a reproducible Emacs at home and work both. There's a little iteration to adapt to changes in Emacs and packages, but after that, it's stable and reliable for a year or two. https://github.com/radian-software/straight.el https://github.com/radian-software/straight.el
- RahulMJ 7mo agoHey celadevra_, author here. Thanks for submitting my post to HN, I really appreciate it. Seeing it stay at #1 for a few hours while my blog server struggled with the requests was quite a joy :) PS: Also, thanks to everyone who commented on it. While I can't reply to all of you, I'm doing my best to read everything. I'm glad to hear that the project resonates with so many people, whether philosophically, aesthetically, or as something partially useful.
- celadevra_ 7mo agoI've used {GNU |X}Emacs intensively for over 20 years and never thought about doing a thorough study of many of the things it provides like you do in Emacs Solo. Your work is inspiring to me in showing me what dedication and thoughtfulness can achieve, even when it seemed at the beginning as trivial as one tending their own homestead. Many, many kudos.
- ajstars 7mo agoThe solo Emacs path is underrated for building deep understanding. Most people reach for a config framework immediately and end up with a system they can't debug. Starting from scratch forces you to actually understand what each piece does, even if it takes longer upfront.
- deleted 7mo ago[deleted]
- akagr 7mo agoI feel I can given up most packages I use for some hand rolled code (with a significant time investment, that is). There will be tradeoffs. Every thing except magit. I can’t think of a better way to use git, and it’s one of the main reasons I’ve never survived my adventures in editor wilds for very long.
- pmontra 7mo agoThank you. I finally looked into project.el and I started using C-x p f, C-x p b. It was already configured by default. Lazy me.