Rendered at 09:12:24 GMT+0000 (Coordinated Universal Time) with Cloudflare Workers.
nonfamous 7 hours ago [-]
I learned “real” programming in the early 90’s by learning Elisp to customize Emacs. (Before that the only languages I’d written in by choice were C64 Basic and Assembler.) Like the OP, I used Elisp for everything - scripts to bulk-edit files, manage the file system, format posts, etc. etc.
Unlike the OP I hated the scratch buffer for running Elisp, so I created a REPL for Elisp that behaved more (in my naive eyes) as a real language. I was very excited when RMS emailed me to ask to include it in Emacs. Last I checked (a few years ago now) it was still there as M-x ielm (Inferior Emacs Lisp Mode).
jkubic 4 hours ago [-]
Very cool story thank you. I still use ielm regularly.
xvilka 17 hours ago [-]
Something like Lem[1][2] could go even further because of the richer CommonLisp ecosystem compared to Elisp one.
What do you mean by "richer ecosystem"? Have you ever seen GitHub language stats - there's so much Elisp on GitHub alone, it's absolute bananas. The amount of Elisp in the wild probably surpasses the amount of Clojure, CL and Racket combined. And mind that it isn't "a general use" PL - it exists for one and single purpose.
Lem is great and I'm happy there's finally something out there to challenge Emacs' hegemony, yet pragmatically, unless someone builds a way to run Elisp in Lem, it's unlikely to overthrow Emacs anytime soon, and that's just not gonna happen.
Org-mode, Magit, and thousands of packages aren't just "Elisp code" - they depend on Emacs' specific buffer model, text properties, overlays, markers, the display engine, process handling, and countless quirks packages rely on (intentionally or not). A Lem Elisp interpreter that didn't also reimplement all of that faithfully would run trivial `.el` files and choke on anything real. At that point you've reimplemented Emacs inside Lem.
Elisp is not the biggest point here and Neovim proves that with pivoting to Lua; the crux is the runtime and the corpus, and reimplementing those is the actual mountain. That is real ecosystem for whatever reason you're choosing to simply ignore.
cmrdporcupine 7 hours ago [-]
Lem already has a clone of legit. And there's org-mode-alikes, as well.
There's very little I miss when I use lem, TBH.
adrian_b 16 hours ago [-]
Having CommonLisp as the extension language would indeed be a great improvement over Elisp.
However, I am suspicious about the dependency of Lem on Webkit, which for me is rather associated with inefficiency and low performance than with the instant reactions that I expect from programming text editors, terminal emulators and tiled window managers.
The main problem is that it is very difficult for any replacement of Emacs to offer everything that already exists for Emacs.
In my opinion, the only way in which such a replacement would succeed would be if it would include an automatic translator from Elisp to CommonLisp scripts executable by it, with equivalent functionality.
chiffaa 14 hours ago [-]
Lem can also render via ncurses, which works fairly fine if you don't need mouse support. It used to also have an SDL2 frontend, but it was deprecated for reasons I don't remember
anthk 12 hours ago [-]
Emacs has cl-lib and most CL users can get into Emacs in seconds (if they are not already proficient enough, most of them btw).
cmrdporcupine 7 hours ago [-]
The WebKit UI is actually snappier and more performant than the previous SDL2 one.
I don't think WebKit is slow at all. Browser bloat around it often is.
conartist6 16 hours ago [-]
I chose the JS ecosystem. Why does the power of Emacs not belong in the browser? These days JS is a powerful enough FP language to do it.
iLemming 12 hours ago [-]
Because you need Lisp. That's the actual "power of Emacs". Emacs is a Lisp-interpreter with a built-in text editor. Everything stems from that. Anyone challenging "the choice" of Lisp as the configuration language for an editor, saying things like: "Why? If X is better - faster, more modern, more popular...", etc., have misunderstanding of what makes Lisp so uniquely powerful.
A specific language is not the point - to implement anything similar to Emacs, you'd need a homoiconic language or at least a language that gives you live, reflective, late-bound image with code-as-data. Without that single aspect tons of things simply and inevitably (as history shows) will get complicated.
Why we have not seen such differentiator with VSCode? Because of their design choices - the extension language and the editor internals live in different worlds behind an API boundary. Emacs essentially has no such boundary. That's the power, and also a consequence of the image + homoiconicity combo.
conartist6 12 hours ago [-]
> to implement anything similar to Emacs, you'd need a homoiconic language
I've got that. It took 6 years but I developed a comprehensive homoiconic layer for Javascript
kubb 7 hours ago [-]
How does that work? Homoiconicity is a property of the language, not something you can develop as a layer.
conartist6 7 hours ago [-]
JS was already pretty close. Babel allows a fantastic degree of power in code transformation, it just doesn't preserve blank space.
If I were to use my preferred terminology I would simply call these transform-your-own-code formats "embeddings", and there can be many embeddings for a single language.
BeetleB 12 hours ago [-]
Because to replicate the power of Emacs, you'd need to throw away a lot of privacy/security in the browser. You'd need to let one tab read the contents of another by default. A change to make your mail reading better may break your banking app (yes, that's a reality with Emacs).
Also, Emacs windows vs tabs. Think of having each tab be a non-overlapping window within the browser window.
Finally, most browsers don't let JS code modify the browser itself. If I suddenly decide I'd like Firefox's menu completely rearranged, I don't think JS will give it to me.
conartist6 12 hours ago [-]
If I have two editor tabs open as two browser tabs they should already be able to talk if they're from the same origin, which different editor tabs would be.
The JS code won't be able to modify the browser itself, but neither can ELisp modify the actual Emacs binary code. The customizability in both cases is really coming from an "OS" being implemented in user-controlled scriptspace. You'd have just as much ability to customize that HTML-and-JS OS if it was running in the browser as you have to customize Emacs I think...
BeetleB 11 hours ago [-]
> If I have two editor tabs open as two browser tabs they should already be able to talk if they're from the same origin, which different editor tabs would be.
I can interpret your original query two ways:
1. Why can't we replicate Emacs like power in the browser?
2. Why can't we replicate Emacs like power in the browser using existing web sites as apps?
I was answering 2 above. If your mail application is Gmail, then non Google tabs can't read your emails and vice versa.
If you meant it from the perspective of 1, then you can get much further. You'd have to write a generic mail app in JS that can connect via IMAP, etc.
The other headache you'll have to deal with is not having easy access to the disk. Can you easily implement a file manager in JS and run it from the browser? Or access the processes on your computer (e.g. say you want to write a "top" tool for the browser)?
Essentially, the Emacs ecosystem has lots and lots of useful Elisp packages written over the decades. The browser doesn't. And the ones that exist are self contained (i.e. you don't find a JS TODO app that is meant to integrate with someone else's JS Mail app).
And browsers don't have an easy way to install a JS app. How would you do it? Bookmarklet?
As for customizing the browser via JS - yes, you're technically correct. The difference is that much of Emacs is designed to be modifiable via Elisp, whereas that's not the case in most browsers.
So to answer your question, it is technically feasible. You just need a better browser and a lot more people writing client side JS apps.
conartist6 10 hours ago [-]
Ah, yeah, I was answering 1.
Access to disk is... not great, I agree, but I'm not terribly worried about it. My plan is to eliminate the checked out file tree and plug the version control straight into the core data structure of the editor. I just hash the nodes of the underlying concrete syntax tree, which is my Emacs-y homoiconic data structure.
The downside is that the ecosystem for this product starts out empty. It's a whole new set of protocols, data structures, and APIs. Even so, the JS ecosystem does contain quite a lot of code that I think will be of value
crabbone 10 hours ago [-]
> The JS code won't be able to modify the browser itself, but neither can ELisp modify the actual Emacs binary code.
You misunderstood the problem. Remember when Firefox' GUI was made of XUL and that was indeed accessible from JavaScript (before they abandoned add-ons in favor of Google's extensions). Then you had add-ons like Firebug or KeySnail that could indeed take control of the browser's "chrome" (i.e. the visual elements that don't belong to the HTML page, s.a. tabs, menus, address bar, buttons around it).
If you don't remember... life was a lot better back then. I've built a tool for interactively highlighting selected DOM elements in the page from a dedicated toolbar for example (this was before the developer tools). You could completely remap all browser keys. You could call external editor to edit the text in text areas or text inputs. You could call programs on the local filesystem (there used to be an FTP add-on that did that).
conartist6 10 hours ago [-]
Wait, so what is the problem? For me the biggest problem is that CSRF makes it unnecessarily difficult to write a "browser within a browser", which would otherwise not be all that hard
veqq 7 hours ago [-]
> so what is the problem?
That browsers/web tech is moving in the opposite way and blocking various emacs-esque usecases.
conartist6 6 hours ago [-]
There's nobody more interested than me. Which use cases? Blocking how?
all2 16 hours ago [-]
They told me the future would have horrors beyond my comprehension.
But I understand this particular horror. I might even agree... :D
getpokedagain 14 hours ago [-]
Nearly 40 years of stuff.
People iterating on a problem space over time is the best way we have found to improve things.
The JS ecosystem is not that old and also attempts to solve hundreds of unrelated problems like running software without peoples consent.
conartist6 12 hours ago [-]
As much as I don't like all the choices they've made, the choices have been the result of iterating on the problem space over time.
And... yeah the consent thing is messy. There's a kind of implicit consent in knowing that a user that does not consent can block scripts. But then it can quickly become coerced consent if there's some IRL reason you need to use the page and it absolutely does not work without JS.
That said, I'm a JS-webapp UI guy. Partly that's just what I've built my career on, largely because it was the new field emerging as I was coming up. I could learn things quickly and convert what I learned into a salary. But the second reason is that I'm disillusioned with HTML as the wire format for the web. If you choose to render HTML on your server, you're centralizing costs in a way that will eventually force you towards an extractive relationship with your users. Not only are you centralizing the cost of rendering and transmitting the HTML, but you're also centralizing the cost of building and maintaining the UI layer.
This is (partly) because HTML failed at being a semantic language. There was a brief flicker of hope with XML and XSLT -- for a hot second you could write a compact semantic document and send it over the wire. No longer...
tonyarkles 13 hours ago [-]
> The JS ecosystem is not that old
I hate to tell ya this... LiveScript was renamed to JavaScript in 1995, and the first ECMAScript standard was published in 1997. So not 40 years old, but 31 years old.
NodeJS (liberating JavaScript from the browser) was first released in 2009... so again, not 40 years old, but old enough to have a drivers license.
I agree with you on the other side though: despite the language being relatively old and stable, it feels like the wheel's getting reinvented over and over again and "this will be a good enough pattern for the next decade" hasn't ever really shaken out, unlike Lisp or even Python.
getpokedagain 13 hours ago [-]
I think I need to update my sales pitch for the passage of time. Emacs is probably closer to 50 now.
taeric 11 hours ago [-]
Also notable that the way changes are introduced to the different languages is so different that this is just hard to really look at. Notably, elisp of today is not dramatically different from elisp of 20 years ago. JavaScript? Basically a brand new language after ES6+.
conartist6 10 hours ago [-]
ES6 was released 16 years ago. I'm building on top of ES6 like it's rock solid, and so far I haven't been disappointed. After ES6 the langdev process changed materially, and it now rewards introducing language features that are, in my view, half-baked. I have had to take over parts of the work of the standards committee to be able to do this project at all.
Right, but that about halves the age of JavaScript as noted in this thread.
I fully agree that it is reaching a more stable place now than it was 5 or 10 years ago. It is still nowhere near as old as elisp.
conartist6 10 hours ago [-]
Oh for sure. I'm not trying to make a case against Emacs or Elisp or anything. Mature tech is highly, highly valuable. I just wanted to know if JS could do it. Could it, can it host a whole unix-y, emacs-y OS?
throwaway27448 11 hours ago [-]
No, the power of the browser belongs in emacs. You're composing the wrong direction!
Anyway aren't you just describing vscode?
conartist6 10 hours ago [-]
I think I'm composing in the right direction! Terminal protocols are 50 years old, have some wild backwards incompatibilities, and are not accessibility-friendly. Funny enough CSTML functions both like a terminal protocol and like a replacement for HTML and XML
m463 14 hours ago [-]
Maybe python can't do it, but I would love to extend my editor (and even browser) using python.
What it could at least let you do is view JS code using more "Pythonic" syntax rendering. The semantics would still be JS, but you could get rid of the curly braces while you were reading it if you just preferred semantic indentation, for example
stackghost 14 hours ago [-]
"Common Lisp Emacs" has been attempted a few times. Lem seems like the best effort yet, and I was really excited about it until they decided to adopt a webview renderer.
I've got vscode for that.
veqq 7 hours ago [-]
It supports ncurses too. And if someone else wanted to maintain the SDL2 version or such, they'd be happy. The issue's just a lack of engineering effort and more people complaining than assisting. :/
beepbooptheory 17 hours ago [-]
I am not sure if I would bet one way or another on who has the richer ecosystem here.. They are both great. I would probably wager elpa has more packages in general than quicklisp, but maybe not necessarily richer/higher quality.
boscillator 14 hours ago [-]
> Suppose I want to work in a single place for all my contexts, both personal and professional.
This has always been my problem with adopting Emacs or Obsidian or any other app that purports to do this. Who are y'all working for that you can bring professional stuff onto the same system as personal stuff? I don't want my personal emails on my work computer, and my boss would be rather upset if I brought work emails onto my personal computer. I'd love one of these do everything apps that lets me tag and sync just stuff that ought to be synced.
amrit3128 1 hours ago [-]
I assume it was not to use same profile but the same environment of all text related tasks. Like I write blogs and research papers in org mode, and then simply export the necessary file format. I can perform text operations easily in mail, i can have elisp snippets generate mail for me depending on the sender, I can use calc to add numbers inside the buffer, I can have latex previews.
BeetleB 12 hours ago [-]
I think his secondary point is to show the potential. His primary point is likely that if you set this all up for home use, you can use mostly the same config to use it at work. This way, when you go home or go to work, you're dealing with the same environment and workflows.
taeric 12 hours ago [-]
Many people that do this are almost certainly freelance contractors in some facility?
Probably, though, many are just using personal as not strictly personal, but the kind of personal things you might do while at a desk job.
kreyenborgi 3 hours ago [-]
You don't have to combine work and personal stuff in Emacs. You can for example set it up to just connect to work email and work jira and work slack and work clankers etc.
skydhash 13 hours ago [-]
Maybe he is a freelancer or a business owner and not an employee. If you’re one of the former, there’s often little separation between work and personal. I only truly enforce separation when I’m an employee, with different devices for each context.
rbc 17 hours ago [-]
GNU Emacs is probably the easiest way to capture the spirit of working on the Lisp machines. Interlisp is an ongoing project that takes you even further down that road.
jiehong 12 hours ago [-]
If we take a browser, and add things to make it a super app, we would basically get an extensible electron app, right?
Maybe, why not?
hatsumisen 10 hours ago [-]
Can someone define "lispboard" for me? The article calls the browser a lispboard, which breaks every guess at a definition I have.
slowmovintarget 9 hours ago [-]
The author defines it:
> Like an electronics breadboard, a board where every module you plug in shares a bus with all the others, except here the modules are written in Lisp.
The bit about the browser seems to simply be a strained metaphor: "The browser is a rented Lispboard, with a landlord. Emacs is the only one you can own."
hatsumisen 9 hours ago [-]
Thanks! I missed that.
behnamoh 17 hours ago [-]
It's a matter of philosophy; would you rather have multiple small apps that do only one job or one "super app" that does it all?
Ironically, starting from the former, I've now turned my tmux into the latter with so many utility apps integrated into it. But now I can see the benefits of each approach. Maintaining "super apps" is more challenging due to the coupling of so many pieces to each other.
kleiba2 13 hours ago [-]
If the "super app" is modular - like Emacs is - you basically get the best of both worlds.
dietr1ch 16 hours ago [-]
And building a consistent good experience from isolated tools is even harder. The problem is just hard and I think good criteria with the super app approach is the way to go.
I really like Spacemacs. It's discoverable, extendable, quite consistent.
behnamoh 16 hours ago [-]
> And building a consistent good experience from isolated tools is even harder.
Yes, I agree, which is why my tmux slowly devours my numerous small utility apps into itself! I haven't tried Spacemacs yet, too Vim-pilled at the moment..
BeetleB 12 hours ago [-]
> I haven't tried Spacemacs yet, too Vim-pilled at the moment..
You do know that Spacemacs defaults to Vim bindings, right?
Unlike the OP I hated the scratch buffer for running Elisp, so I created a REPL for Elisp that behaved more (in my naive eyes) as a real language. I was very excited when RMS emailed me to ask to include it in Emacs. Last I checked (a few years ago now) it was still there as M-x ielm (Inferior Emacs Lisp Mode).
[1] https://lem-project.github.io/
[2] https://github.com/lem-project/lem
Lem is great and I'm happy there's finally something out there to challenge Emacs' hegemony, yet pragmatically, unless someone builds a way to run Elisp in Lem, it's unlikely to overthrow Emacs anytime soon, and that's just not gonna happen.
Org-mode, Magit, and thousands of packages aren't just "Elisp code" - they depend on Emacs' specific buffer model, text properties, overlays, markers, the display engine, process handling, and countless quirks packages rely on (intentionally or not). A Lem Elisp interpreter that didn't also reimplement all of that faithfully would run trivial `.el` files and choke on anything real. At that point you've reimplemented Emacs inside Lem.
Elisp is not the biggest point here and Neovim proves that with pivoting to Lua; the crux is the runtime and the corpus, and reimplementing those is the actual mountain. That is real ecosystem for whatever reason you're choosing to simply ignore.
There's very little I miss when I use lem, TBH.
However, I am suspicious about the dependency of Lem on Webkit, which for me is rather associated with inefficiency and low performance than with the instant reactions that I expect from programming text editors, terminal emulators and tiled window managers.
The main problem is that it is very difficult for any replacement of Emacs to offer everything that already exists for Emacs.
In my opinion, the only way in which such a replacement would succeed would be if it would include an automatic translator from Elisp to CommonLisp scripts executable by it, with equivalent functionality.
I don't think WebKit is slow at all. Browser bloat around it often is.
A specific language is not the point - to implement anything similar to Emacs, you'd need a homoiconic language or at least a language that gives you live, reflective, late-bound image with code-as-data. Without that single aspect tons of things simply and inevitably (as history shows) will get complicated.
Why we have not seen such differentiator with VSCode? Because of their design choices - the extension language and the editor internals live in different worlds behind an API boundary. Emacs essentially has no such boundary. That's the power, and also a consequence of the image + homoiconicity combo.
I've got that. It took 6 years but I developed a comprehensive homoiconic layer for Javascript
If I were to use my preferred terminology I would simply call these transform-your-own-code formats "embeddings", and there can be many embeddings for a single language.
Also, Emacs windows vs tabs. Think of having each tab be a non-overlapping window within the browser window.
Finally, most browsers don't let JS code modify the browser itself. If I suddenly decide I'd like Firefox's menu completely rearranged, I don't think JS will give it to me.
The JS code won't be able to modify the browser itself, but neither can ELisp modify the actual Emacs binary code. The customizability in both cases is really coming from an "OS" being implemented in user-controlled scriptspace. You'd have just as much ability to customize that HTML-and-JS OS if it was running in the browser as you have to customize Emacs I think...
I can interpret your original query two ways:
1. Why can't we replicate Emacs like power in the browser?
2. Why can't we replicate Emacs like power in the browser using existing web sites as apps?
I was answering 2 above. If your mail application is Gmail, then non Google tabs can't read your emails and vice versa.
If you meant it from the perspective of 1, then you can get much further. You'd have to write a generic mail app in JS that can connect via IMAP, etc.
The other headache you'll have to deal with is not having easy access to the disk. Can you easily implement a file manager in JS and run it from the browser? Or access the processes on your computer (e.g. say you want to write a "top" tool for the browser)?
Essentially, the Emacs ecosystem has lots and lots of useful Elisp packages written over the decades. The browser doesn't. And the ones that exist are self contained (i.e. you don't find a JS TODO app that is meant to integrate with someone else's JS Mail app).
And browsers don't have an easy way to install a JS app. How would you do it? Bookmarklet?
As for customizing the browser via JS - yes, you're technically correct. The difference is that much of Emacs is designed to be modifiable via Elisp, whereas that's not the case in most browsers.
So to answer your question, it is technically feasible. You just need a better browser and a lot more people writing client side JS apps.
Access to disk is... not great, I agree, but I'm not terribly worried about it. My plan is to eliminate the checked out file tree and plug the version control straight into the core data structure of the editor. I just hash the nodes of the underlying concrete syntax tree, which is my Emacs-y homoiconic data structure.
The downside is that the ecosystem for this product starts out empty. It's a whole new set of protocols, data structures, and APIs. Even so, the JS ecosystem does contain quite a lot of code that I think will be of value
You misunderstood the problem. Remember when Firefox' GUI was made of XUL and that was indeed accessible from JavaScript (before they abandoned add-ons in favor of Google's extensions). Then you had add-ons like Firebug or KeySnail that could indeed take control of the browser's "chrome" (i.e. the visual elements that don't belong to the HTML page, s.a. tabs, menus, address bar, buttons around it).
If you don't remember... life was a lot better back then. I've built a tool for interactively highlighting selected DOM elements in the page from a dedicated toolbar for example (this was before the developer tools). You could completely remap all browser keys. You could call external editor to edit the text in text areas or text inputs. You could call programs on the local filesystem (there used to be an FTP add-on that did that).
That browsers/web tech is moving in the opposite way and blocking various emacs-esque usecases.
But I understand this particular horror. I might even agree... :D
People iterating on a problem space over time is the best way we have found to improve things.
The JS ecosystem is not that old and also attempts to solve hundreds of unrelated problems like running software without peoples consent.
And... yeah the consent thing is messy. There's a kind of implicit consent in knowing that a user that does not consent can block scripts. But then it can quickly become coerced consent if there's some IRL reason you need to use the page and it absolutely does not work without JS.
That said, I'm a JS-webapp UI guy. Partly that's just what I've built my career on, largely because it was the new field emerging as I was coming up. I could learn things quickly and convert what I learned into a salary. But the second reason is that I'm disillusioned with HTML as the wire format for the web. If you choose to render HTML on your server, you're centralizing costs in a way that will eventually force you towards an extractive relationship with your users. Not only are you centralizing the cost of rendering and transmitting the HTML, but you're also centralizing the cost of building and maintaining the UI layer.
This is (partly) because HTML failed at being a semantic language. There was a brief flicker of hope with XML and XSLT -- for a hot second you could write a compact semantic document and send it over the wire. No longer...
I hate to tell ya this... LiveScript was renamed to JavaScript in 1995, and the first ECMAScript standard was published in 1997. So not 40 years old, but 31 years old.
NodeJS (liberating JavaScript from the browser) was first released in 2009... so again, not 40 years old, but old enough to have a drivers license.
I agree with you on the other side though: despite the language being relatively old and stable, it feels like the wheel's getting reinvented over and over again and "this will be a good enough pattern for the next decade" hasn't ever really shaken out, unlike Lisp or even Python.
I had to reinvent iteration to get both perf and abstraction at the same time: https://docs.bablr.org/architecture/spacetime
I also had to create records and deep freezing: https://es.discourse.group/t/proposal-records-a-new-one/2546...
I fully agree that it is reaching a more stable place now than it was 5 or 10 years ago. It is still nowhere near as old as elisp.
Anyway aren't you just describing vscode?
What it could at least let you do is view JS code using more "Pythonic" syntax rendering. The semantics would still be JS, but you could get rid of the curly braces while you were reading it if you just preferred semantic indentation, for example
I've got vscode for that.
This has always been my problem with adopting Emacs or Obsidian or any other app that purports to do this. Who are y'all working for that you can bring professional stuff onto the same system as personal stuff? I don't want my personal emails on my work computer, and my boss would be rather upset if I brought work emails onto my personal computer. I'd love one of these do everything apps that lets me tag and sync just stuff that ought to be synced.
Probably, though, many are just using personal as not strictly personal, but the kind of personal things you might do while at a desk job.
Maybe, why not?
> Like an electronics breadboard, a board where every module you plug in shares a bus with all the others, except here the modules are written in Lisp.
The bit about the browser seems to simply be a strained metaphor: "The browser is a rented Lispboard, with a landlord. Emacs is the only one you can own."
Ironically, starting from the former, I've now turned my tmux into the latter with so many utility apps integrated into it. But now I can see the benefits of each approach. Maintaining "super apps" is more challenging due to the coupling of so many pieces to each other.
I really like Spacemacs. It's discoverable, extendable, quite consistent.
Yes, I agree, which is why my tmux slowly devours my numerous small utility apps into itself! I haven't tried Spacemacs yet, too Vim-pilled at the moment..
You do know that Spacemacs defaults to Vim bindings, right?