But maybe even more remarkable: he got kicked out of his flat in Greece, couldn't afford a new place, bought a small plot of land in the mountains and started building a hut from materials he was able to afford or from things neighbours gave him. Really the bare minimum (he often sat in his hut with a jacket in winter cause it wasn't well isolated/heated)
Absolutely inspiration, all documented on his YouTube channel https://youtube.com/@protesilaos?si=MnjV7MhKtsT5RDSM
I also enjoy watching his videos where he talks about various philosophical topics from a very clear, pragmatic and down-to-earth perspective. My impression is that he is a really kind and humble person and that he lives by his philosophical insights, without bragging about his lifestyle or judging about how other people live their lifes.
But, Prot also has other incredible packages - I am a user of denote, his notetaking package. Then there are ef-themes, for those who like themes with more color. There are gems there, but really, one should try modus for a while first.
And here we are.
As an emacs user and future philosopher-in-the-mountains, Prot is a great inspiration.
But I still wish the emacs community could adopt a modern data structure library. It's difficult to consolidate usage of sequences (lists/vectors) with alists and plists. This would make it so much more accessible.
I immediately notice there's seq-filter, which can kill off one of my helper routines. And then (now I'm looking...) I've discovered this was always equivalent to cl-remove-if-not. But I never realised, because of the mystery meat naming conventions.
I have been using Emacs for about 40 years, and as a crazy side effect of the mountain of LLMs hype, with a lot of productivity enhancing goodness, I think that Emacs can only gain in popularity because of several excellent Emacs LLMs packages. Most of the world is exploiting LLMs with VSCode and its variants, but Emacs is also just about perfect for integrating LLMs into workflows and for having fun and playing around.
And this is despite the fact that Emacs Lisp routinely flouts every single software engineering "best practice". The language is dynamically scoped by default! It simply doesn't have namespaces! Static types? Hah! (And I, an inveterate Haskeller, don't even miss them.) You can—and people routinely do—hook directly into all sorts of implementation details from other parts of the codebase.
And yet it just works. And it works remarkably well.
My theory: what matters isn't "best practices", it's have a coherent conceptual design and code that reflects that design. Emacs is designed around a small but expressive set of core concepts that it uses in a consistent manner. Text with properties, buffers, modes, commands, customization variables... Almost everything more complex in Emacs is structured out of these (+ a handful more), and, once you've internalized them, it's surprisingly easy to both learn new higher-level tools and to write your own.
The design of both the user interface and the code directly reflect these concepts which gives us a naturally close connection between the UI and the code (it's almost trivial to jump from an interaction to the code that powers it), makes both UI and code units effortlessly composable and generally makes it easier to understand what's going on and how we can change it.
Just because something has a >0 level of success doesn't mean there are no negatives. "Best practices don't matter because Emacs Lisp doesn't follow them and it just works" isn't a valid argument: it could very well be that Emacs (Lisp) would shine fifteen-fold brighter if it did also follow those practices. It just happens that having those elements you mentioned as positives are enough to keep the train going in spite of the shortcomings.
I use Emacs and program in Emacs Lisp to scratch my itches, and I agree that there are elements that make it work and hey, I'm still here, but I will bet good money that a parallel universe with Emacs Lisp', Now With Namespaces would work even better.
"Working" isn't binary.
But based on my holistic experience using Emacs—more than a binary "it works"—I'm convinced that the conceptual design carries most of the weight.
Would namespaces, lexical scoping, etc be better? Almost definitely. But it would be a marginal improvement, a difference in degree not kind. Other "best practices" like more aggressive information hiding would go against Emacs's design and make it worse as a whole.
Most "best practices" are neither necessary nor sufficient and, in most cases, not even particularly effective, even when they offer strict improvements over the status quo.
That's the thing - it probably would not be.
IMO, the key things that allow Emacs to succeed and last, while being somewhat unique in how it "routinely flouts every single software engineering "best practice"", are not merely conceptual, but cultural or even philosophical. The most fundamental of those, IMO, is that Emacs is ultimately owned by users, who are treated as intelligent partners in the relationship. Everything is designed with extensibility in mind. There's no hard boundary between "core developers", "third-party extension developers" and "end-users" - everyone can be any of them, including all three, at any time.
Maximizing extensibility and interoperability, not demanding "users" to coordinate with "developers" and ask for permission, not chasing user growth (it's all Free Software), expecting that everyone is a responsible adult, encouraging users to make Emacs "their own" - all that leads to an approach that goes the opposite to standard software development practice, because the standard practice is built around entirely opposite assumptions.
Same with lexical scoping? Not really following you.
(Or, in short, what you're doing each time you're setting environment variables in a shell call. Environment variables are dynamic scoping, just one level up.)
Namespaces are mostly fine if they're only helping against name clashes, and not trying to do access control. Even then, given the Lisp nature and high extensibility of Emacs (two sides of the same coin, actually), normal namespaces you see in other programming languages are a bad fit, as they don't play well with symbols and various patterns around using symbols as designators resolved at runtime. You'd need a namespacing solution like packages in Common Lisp, which is quite different than what people are used to.
In general, none of that would be a show-stopper - it's more that Emacs always leaned on being easy to extend, including extend interactively (via REPL, or more commonly, just selecting and eval-ing blocks of code), and things like namespaces tend to make it more annoying.
Do you mean lexical binding, available as an option since 24.1?
*** Welcome to IELM *** Type (describe-mode) or press C-h m for help.
ELISP> +
*** Eval error *** Symbol’s value as variable is void: +
ELISP> #'+
+
But I get it, you mean namespaces like Common Lisp packages so people don't need to call stuff `org-babel-load-languages', but they can just call it `load-languages' and put it in the `org-babel' package.I think so too; that said, the language could definitely be better. It suffers from a lot of primitive obsession. Instead of structs, you often find either vectors or lists with predefined element positions; instead of map, ordered map, and multimap types, it's just various kinds of lists everywhere. They're not even used consistently: for the same thing, one package may use an alist and another a plist.
That's sad to hear, because I somehow have the exact opposite experience. First, it was about fixing things in my config. Then I often would catch myself in a "why can't I do this better" state. And it could be anything. Like one day I was copying the current URL in the browser, and then switched again to copy the description. Next day I caught myself doing that again. And I realized - "shit, I never thought before how often I have to do this crap". Then I wrote a helper.
These days, I don't even blink, if I need something, I'll just start whipping up some shitty Elisp in my scratch buffer. And with help of LLM packages like gptel - it's a breeze. What's awesome is that I can play with that code even without having to save that shit anywhere. Sometimes, I realize the solution is not as easy to make as I initially thought, so I'd just leave it there in my scratch buffer. It sits there, sometimes marinating for weeks - I have a persistent scratch buffer. I even get excited when I stumble on a problem I want to optimize.
Few weeks ago I was in a pair-programming Zoom, and my colleague, let's call them Matthew, was screen sharing. I couldn't help distracting Matt asking questions like, what is that? Can you share this link? Wait a minute, don't scroll away, I need to write that down. etc.
After that I thought of solving that dilemma. I sat down and wrote a helper that calls tesseract to OCR text from an image in clipboard. Took me no more than 20 minutes. https://github.com/agzam/.doom.d/blob/main/modules/custom/wr...
A few days ago I happened to see my 1998 .emacs file in an old backup. It was only around 100 lines, but I think most of those lines have survived into my current init.el. The oldest lines are probably over 30 years old now. The API is reasonably stable, but not perfect. My current file has lots of logic to handle running in older Emacs versions.
But a lot of other things have been more like small conveniences or one-off improvements—things that would not make sense if they took more than 20 minutes to write, but do make sense in Emacs. A few random examples: some custom ways to enter Unicode characters; a command to insert TODO comments; a different way to manage Emacs windows; a little package for jumping to locations I care about; a way to insert a file path into a buffer; a work-specific tool to go from UUIDs to internal URLs; some random stuff for authoring a book with Pandoc + LaTeX; a command to insert Haskell LANGUAGE pragmas (contributed upsteam!); and a bunch more that I'm forgetting.
As a bonus, writing these meant I didn't have to "learn" them in the sense that I know they exist and, if I gave them a keybinding, I did not have to memorize it.
None of these are a big deal on their own! But having an environment that reduces the friction to make small improvements is. Having a tool that I can orient around the way I want to work is qualitatively different from having a tool that makes me orient around how it works.
It's not even that much customization in some absolute sense; everything fits into a few thousand lines of Elisp spread across a few files in my dotfiles repo[1].
[1]: https://github.com/TikhonJelvis/dotfiles/tree/main/home/emac...
Usually tools to alleviate working with dumbass web-based (supposedly needing the corporate-approved browser) stuff for $DAY-JOB.
Oh, and an extension to allow emacs-w3m to handle lynx-style multibookmarks.
This sparks my interest as I am in the early days of both customizing Emacs and attempting to displace some of my browsing with it as well. Could you elaborate further on this multibookmarks concept and perhaps an example of one of those alleviations for working with web-based workflows?
Alleviations are (I'm intentionally vague here) for getting rid of finding a link, clicking through, repeat, repeat, repeat, repeat, just to get to where I need to be (like adding an update to a ticket). I usually only automate processes that are intended for use by mouse/pointer-driving users with an ability to comprehend what (and where) icons are - I have a self-imposed problem withe former and a physically/mentally imposed hard time with the latter.
Seems like the conceptual design helped with that too, reducing the activation energy needed for clear, interactive documentation. The code and the UI are both designed against the same set of consistent concepts, which naturally brings them together and, in turn, makes it so much easier to tie them from one to another. Simplest example: every interaction in the UI is a "command" and commands are reflected in elisp, so having a way to jump from an interaction to the corresponding code and documentation just makes sense. The documentation can be organized along the same conceptual lines as the code and the UI.
Emacs really is an amazing design study.
Or the official tutorial: https://www.gnu.org/software/emacs/manual/html_mono/eintr.ht... (which to be clear I haven't read, but have heard nice things about).
Of all the things for which emacs can be criticised, documentation rigor is really not one.
Still, another manual written from a different perspective probably won’t hurt anything.
> See what the critics say about the manual:
> “Often when I read the manual, I think that we should take a collection up to have Lars psycho-analysed.”