Emacs as your video-trimming tool
xenodium.com282 points by xenodium 2 days ago
282 points by xenodium 2 days ago
This is impressive, but (and probably because I'm not the intended audience for this post) I don't get it, I kind of want to get it though. With "it" I mean making Emacs do X, where X is something far from editing text files. It always seems to me like playing Doom on a pregnancy test. Sure you can do it, sure it's impressive, but should you?
n.b. I'm a C# developer that has accepted my fate and use Visual Studio to earn a living, though I've made sure I know my tool, flaws and merits, better than most developers I've met/worked with. My first job as a programmer was writing C++ code in Emacs and can't remember anything negative about that experience (other than getting used to ctrl+x, ctrl+s for saving and, by reflex, doing the same in Excel, and losing a big part of the document that I had just selected to move, because Excel couldn't undo past last save).
Reading the (at the time I'm writing this) 13 comments on this post I see mentions of at least three lightweight programs that does this. What other than "the mountain is there" makes someone think Emacs would be the tool for this? As a Resolve user I know what tool I'd reach for even if using a multi GB, Hollywood grade, non linear editor, compositor and color grader for trimming a short video clip is about as ridiculously overpowered as using a sledge hammer to press a key (and I did exactly that just a few days ago).
Like I said, I'm most likely not "getting it", on multiple levels. Please educate me, why would I use Emacs for this or any of the page upon page of "strange" use cases you find if you search for "Emacs" here on HN. I know Emacs is a powerful editor but I can't for the life of me understand why I would use it to trim video clips.
Emacs is weird. I think it changed something in my brain. Before Emacs, I never thought I would ever try controlling video playback from my editor. "Just why?" I probably would've said. I never thought I'd be trying to get the text from the active tab in my browser. Or search through my browser history. Or OCR the content of my clipboard, or control my WM. Dang, before Emacs, it didn't even occur to me to try to type just about any text in my text editor - which now makes absolute sense - why would I ever bother typing in my browser window, Slack, Zoom, or email client?
In Emacs, I have all the tools I need for dealing with text - thesaurus, spell-checking, definition and etymology lookup, search engines, translation, LLMs, etc. Why, oh why, wouldn't I ever try typing anything longer than two words in anything else?
Like, for example, while typing this very comment, I may come across a thought: "I think I already made a similar comment some time ago, let me find it..." What would a regular user do? They'd switch to the browser, navigate to HN, scroll to the bottom, type search query, lookup on the page, jump to the next, keep paging until they find it, copy, switch back, paste... What would an experienced Emacs user do? They'd search for it without ever leaving their editor, grab the stuff from the buffer and paste it - all within just a few keystrokes. Or if I need to find a url in my browser history - I'd just search for it and insert in-place - two keystrokes+search query.
It's not just faster - it is profoundly satisfying and liberating. It gives you the feeling of being in control. You don't have to deal with the quirks of specialized apps; you don't need to memorize tons of their specific keybindings; it gives you a straight path to extracting or injecting plain text.
That's why those who never made a wholehearted attempt to use Emacs just never get it. And those who have, never can understand why others don't even try to recognize the value.
I hear stories like this and I can kind of see the proposition. But I’d be more eager to, somehow, see a long-running example of it all at work. I think I’m not so skeptical about what it can do, but somewhat skeptical that it’s actually as much of a paradigm shift as some describe it to be. I wonder if oftentimes it falls in the enjoyable hobby category of, “I just really enjoy upgrading my workshop.”
It is indisputably not a hobby, at least for me, personally it ain't. I've been coding long enough to see a difference between "oh, what a nice gimmick" and "how the fuck would I even do that, if I didn't know this way existed...". Long. My first programming language was Sinclair BASIC. The second PL I learned was Pascal. I picked up a few more over the years. I'm not trying to show off, nor am I claiming to be an outstanding programmer - I'm neither great nor terrible. I'm just saying I've been doing this shit for a long time, that's all.
It isn't a hobby, because Vim and Emacs allow me to perform in a way that I consider far more enjoyable, productive and satisfactory than I ever had before them. That is of course on a personal empirical basis - I cannot promise them having the same effect on anyone else.
In my opinion, after many years using many different tools, techniques, ideas and methodologies, frameworks, approaches, systems, platforms, workflows, philosophies, paradigms, strategies, practices, concepts, models, theories, and experiments, I personally find these two to be exactly the paradigm shift — in comparison to my prior experience when I didn't have them.
But let me be more specific - the paradigm shift I see is not in Emacs or Neovim as tools themselves. The paradigm shift I sense is in the grand ideas behind these tools - modal navigation and Lisp.
I honestly don't know why more people don't gravitate towards these ideas. Perhaps, because these ideas are kind of like 'meditation' - people say one can only experience the mind shift after practicing it for some time. I wouldn't know - I never practiced mediation for long. And that time required to see the shift can differ for every person - some may grok it quickly, for some, it may take decades without ever even clicking.
Also, you're wrong about "upgrading one's workshop" - it's a misconception that longtime Emacs users constantly have to tweak their configs. My config for example is pretty stable; I often make changes to it not because I have no choice, but because the task at hand calls for it. I write a lot of Lisp because it's an instrument for achieving specific goals and solving specific puzzles - work for which I get paid real amounts of real money. I get paid to use Emacs, not the opposite. So, no: definitely not a hobby.
>I honestly don't know why more people don't gravitate towards these ideas.
They would if there was a bit more GUI introduction. Seriously functional menus and visual indication of modes. With hints from graphical to the faster keyboard sequences.
> It isn't a hobby, because Vim and Emacs allow me to perform in a way that I consider far more enjoyable, productive and satisfactory than I ever had before them. That is of course on a personal empirical basis - I cannot promise them having the same effect on anyone else.
> I honestly don't know why more people don't gravitate towards these ideas. Perhaps, because these ideas are kind of like 'meditation' - people say one can only experience the mind shift after practicing it for some time.
idk this reads a lot like tl;dr: it's a hobby.
It doesn't make sense to define something as a "hobby" just because there's some enjoyable or, in the quote you made, "meditation" and "mind shift" parts in it.
What's a "hobby" anyway? As the one you commented on, I have also been programming for a very long time. And why do I continue to do that, instead of changing to some management role? The answer to that is that I enjoy programming. I enjoy making tools to make the tools to create the thing I want to create, and to have enough stuff I want to create, I have a job which provides that in abundance. There are no hard borders between "hobby" and "job". It's a useless distinction in this case.
YES! Thank you! That's exactly it.
You know what really makes Emacs different than other editors and IDEs? Consider many ways one can transform selected text in VSCode. Let's say there are maybe 3-4 ways, with some extensions it can get to, I dunno a dozen?
Now consider that Emacs allows you virtually unlimited ways of doing the same thing. Because there are virtually unlimited ways to program that behavior.
In VSCode, you'd be clicking buttons and using shortcuts. Imagine if you had virtually unlimited number of buttons there? For different ways of running a command. That would be insane, right?
Well, here comes the argument if VSCode's (default) way maybe actually better? Some may argue about cognitive overhead - flexibility isn't free after all. Some programmers prefer tools to be tools rather than clay, yeah?
That's totally okay, I'm fine with all that. I'm just seriously baffled as to why Emacs is such an underrated and misunderstood tool. Why don't more programmers even attempt to try it? If you are a programmer, for sure, you should be, at least to a certain degree, curious about the ultimate programmable environment, no?
And don't bring the argument that non-emacs things are also "extendable". In virtually none of them can I open a buffer and add yet another way to transform selected text. Right there, without even saving that code in a file.
I'm not sure I agree that non-emacs things are not extensible, but I agree VSCode could be a lot better about extensibility. It's a shame that there isn't some convenient way to add JS hooks at startup like how you can with emacs and elisp.
For an example of a system that I think is probably just as extensible as emacs, look at TiddlyWiki. If you really want to, you can add in arbitrary JS and even the main tiddler edit form is itself a tiddler that can be customized as much as you want.
> I'm not sure I agree that non-emacs things are not extensible
Anything that runs on a computer is a program; by definition it is a "programmable" entity. It's only a matter of the degree of intentional programmability - exposed interfaces, APIs, scripting languages, or configuration systems that make modification practical and supported.
From my perspective as an Emacs user, where I can extend virtually any part of my running system by simply evaling some code in a buffer, without having to save, lint, link, compile, publish or restart - an extreme degree of intentional, designed programmability.
From that perspective, VSCode in comparison pales into looking rather constrained and bureaucratic, making it, personally for me, virtually not extendable - I have close to zero incentive to even try. Don't get me wrong, I would use it for certain tasks; it is an excellent tool, but I don't think it ever would become my main instrument - it will just annoy me to death to deal with it on daily basis. Joyride looks promising for making the experience smoother; still, it feels more like a band-aid.
So, yes, once you truly experience the genuine extensibility of the malleable nature of a Lisp-based system, you would completely rethink your entire understanding of programmability of things. I write code, my main instrument must be easily extendable through Turing complete coding mechanisms, not through structured data in json or xml; nor through clicking buttons or dragging boxes around.
Well, sure, to a certain degree it is a hobby. Here, let me quickly run (define-it-at-point) command while I'm typing this comment, because of course I can do that in Emacs.
First definition says "it's a horse", then there's another:
> Any favorite object, pursuit, or topic; that which a person persistently pursues or dwells upon with zeal or delight, as if riding a horse.
Sure, in that sense it can be characterized as a hobby. What's the opposite of a hobby? Well, it's either "work", "chore" or "obligation"— all three kind of fit for my example. I use Emacs at work, for work, to do stuff I get paid for - check! It sometimes feels like a chore - well, what tool you use everyday doesn't? Sometimes you need to update it, delete stale cache files, reinstall, fix dependencies, etc, so can feel like a chore - check! Whenever I open-source some piece of code that extends Emacs, I have an obligation not to break it, etc. So the third one fits too. So, like I said - not a fucking hobby.
Shall we continue quibbling over words, how what reads to you is not what I meant and maybe even discuss how semantic meaning of words may change due to interlocutors' backgrounds, age, mood or the current lunar phase, or do you have some other kind of nitpicking in mind?
The distinction between a profound paradigm shift and something that can be denigrated as a pasttime is subjective and in turn no empirical investigation will draw out an objective conclusion.
We're not discussing science here. Personal empirical experience is different from scientific empirical proof. If something has profoundly shifted my worldview, thinking patterns, or life approach, that's my direct, lived evidence - my own empirical data.
One's personal transformation, changed perspectives, or new capabilities are real empirical evidence - just not the kind that satisfies scientific methodology's requirements for generalizability.
I never even hinted at attempting to prove it to be universally paradigm-shifting for everybody, but I can certainly vouch for its profound impact on thousands of users based on their direct experience.
I do like having access to stuff while doing similar stuff. Perhaps I'm just a little too lazy to learn that stuff while still getting paid to know other stuff. And I do have just about every tool/feature you mentioned, just not in a single user interface.
I guess the path to Emacs was more of a possibility/probability earlier in my career and I might find it later but for now I'll alt+tab to the browser and/or open a new tab when I need to look up any etymology and stick to navigating around Visual Studio like a pro while they still pay me to do it.
The nice thing with emacs is that you can do as much or as little as you want with it. For me it started with basic text editing, then doing some git stuff with magit, then realizing emacs has wonderful capabilities around notetaking and to-do management in org-mode.
Like you, though, I work in orgs that are very Windows heavy, so I tend to use it more for my personal stuff rather than in my day job
Yeah I know some folks who only really use it for basic text editing and org-mode notetaking. I know writers who only use it to write. I know coders who only use it to code. etc.
> I do have just about every tool/feature you mentioned, just not in a single user interface.
Well, just like I said - you're not getting it, we're talking past each other. It isn't about a "single interface" - not about cramming everything into one window, it's rather about seamless workflow integration. It's like having a command center that orchestrates your existing tools, rather than replacing them. The power isn't in the interface - it's in the programmable glue between your tools.
You say: "I'd open a new tab if I need etymology..." Sure, on the surface it feels like a fair point. However, when you have the ability to request something from any tool or service "at-point", right in the middle of typing a sentence or solving a specific task - it simplifes so many things, and you tend to use those tools more. It's basic psychological phenomenon called 'convenience effect'.
But that's the only half story of it. Here's the practical example I often use as an evidence. I use Google Translate, alright? On its own there's nothing special about it - other editors and IDEs, also probably have integrations like that if not even nicer with GTranslate or some other translating service, right? Yet check this out. I'm learning Spanish, and when I want to translate something like "Colonel was born in 1968", what would GTranslate do? It would translate the text leaving the numbers intact, and that's totally expected. But guess what? I am trying to gain better familiarity with numbers in Spanish, I really do need to see them in their written form.
How long do you think it took me to solve that little personal discomfort? No longer than fifteen minutes. First, I needed to find out what actually was sending the payload to GTtranslate endpoints. I launched Emacs' built-in profiler and performed a task of translation. I found the function. Then I advised it. Advising is an Emacs Lisp mechanism to prepend, append or override the behavior of any given function - built-in or third-party. So, I figured that if I convert the numbers to text first, then send the payload with that text instead of numbers, it will work exactly as I wanted.
I couldn't even find an implementation of numbers-to-word in Elisp, and I didn't want to spend any time trying to write one. So I delegated the task to an npm package. Now, my advising function adjusts the behavior of 'translate' function (that sends the payload) by detecting the numbers in the text and then runs nodejs, changing the payload, so GTranslate spits out: "Coronel nació en mil novecientos sesenta y ocho"
Did I have to write my own browser extension for that? Nope. Did I have to figure out how GTranslate endpoints work? Nope - I didn't even have to open their documentation page. Did I have to re-implement the entire command that sends the payload? Nope - I just needed to tweak one, specific aspect of it, with extreme granularity - the body of the function is ten lines long. If that's not some blackmagickfuckery, I don't know what that is. Maaaan, I wish someone has showed me some shit like that when I was much younger.
> Perhaps I'm just a little too lazy to learn that stuff
Here's a thing about ideas - and don't consider Emacs as a concrete tool, a mere editor, but think of the fundamental idea behind it. You don't need to "learn" ideas. You just have to cultivate some level of curiosity about them. Sure, you may later have to spend considerable time learning the concrete tools behind those ideas, but absorbing the idea is the first step.
And grokking basic fundamentals about the idea of Lisp is pretty trivial - one just needs to learn mainly two things - structural editing and REPL-driven development. Some may argue that even those are not specifically necessary to begin the journey.
You know how the "do" in Taekwondo, Judo, Aikido, Karate-do stands for "path" or "way"? There's no truly "learning" Aikido, you either practice it or you don't. It's a lifelong practice rather than something you "master" or "complete." The idea of Lisp is similar - it's not really something you "learn" in the traditional sense and then move on from. You practice thinking in Lisp.
The fundamental principles of Lisp - code as data, the power of the REPL, recursive thinking, functional approaches - these aren't just techniques you acquire. They become a way of approaching problems, a mindset you cultivate through practice. The practice never really ends - it just deepens.
I haven't done any martial arts, so I'm just spitting words here, but I bet, if I ask anyone who practiced Aikido for a long time if it makes their lives any better, I bet they'd tell me some koans about zen master pouring tea or some other shit that I'd immediately dismiss as complete bullshit, so I wouldn't blame you if you take my words the same way.
> I guess the path to Emacs was more of a possibility/probability earlier in my career
Just like Aikido welcomes practitioners at any age or stage of life, Lisp is always ready for new practitioners. The fundamental principles align here in more ways than one could imagine - "the journey is the destination", "wisdom over athleticism", etc. Many people discover their deepest appreciation for Lisp (or Aikido) later in life, when they have the patience and perspective to appreciate the subtleties. The best time to start is always now.
I really want to learn eMacs but most of my work is in Jupiter notebooks in terra.bio - can eMacs interact with that?
The emacs everywhere package and a browser extension allow you to edit text live in the browser from emacs, every keystroke, copy/paste etc is mirrored in the browser.
I haven't used terra.bio, but this works for any text box, so should just work.
Of course, emacs has modes for Jupiter and other notebooks, as well a Org Mode and a way to run code from Org Mode to function similarly to such notebooks, just you can execute code in any language, not just python, and can then immediately use the results in the rest of your file, including tables. You can even reference tables in your code blocks.
https://github.com/emacs-jupyter/jupyter exists. No idea if it’s awesome or terrible.
FWIW, Org Mode is what a native Emacs user might reach for as alternative to Jupyter notebooks: https://michaelneuper.com/posts/replace-jupyter-notebook-wit... That doesn’t imply that you should both try Emacs and replace Jupyter! Just be aware that if either you are using Jupyter for your own reasons or working with like-minded team there is an alternative which may be preferable for your use-case.
Jupyter support in Emacs is pretty bad, tbh. I keep trying every once in a while (as lots of companies prefer notebooks) and it basically never works.
You could probably get it working locally for yourself but in corporate environments it can be annoyingly hard.
org-mode is a better choice, but note that it's not specialised for Python (which is good and bad) so you may need to wire up some stuff (I mostly use R for personal stuff and that works very well).
How are you integrating with things like HN or your browser history?
I'm glad you asked:
https://www.youtube.com/watch?v=ud3Gmxg5UZg - Browsing Reddit and HackerNews In Emacs (7 minutes).
If you don't want to watch it:
https://github.com/thanhvg/emacs-hnreader - for browsing HN.
https://github.com/thanhvg/emacs-reddigg - for browsing Reddit.
https://github.com/agzam/consult-hn - for searching through HN.
https://github.com/agzam/browser-hist.el - for browser history.
Per the comment, he doesn’t have to, all prior written text is nicely stored in a file (probably an org file), already open in emacs.
No, I don't do that. I don't store my own comments. I just browse and search HN directly in Emacs.
this is inspiring, I am slowly getting to that same conclusion but in neovim... if I write text I want all my nvim fancyness... because oh boy is it fancy!
Yup, Neovim is very awesome, I use it myself pretty much every day whenever I need to ssh to a remote host. There are many reasons though for why it is unlikely to dethrone Emacs as my main driver. Just like Emacs could never fully replace my photo-editing app.
It saddens me how people of Emacs often reject vim navigation outright, just as the broader programming community tends to dismiss the fundamental ideas that drive Emacs.
Neither represents a dogmatic religion, nor do they embody fundamental, conflicting truths about computing. No one needs to choose one and commit to it exclusively - they are simply tools, built upon some brilliant foundational concepts. Understanding and utilizing the ideas behind them may literally transform your life in mind-blowingly positive ways. I wish more people contemplated this profound truth, instead of thinking they have to stick with one, particular way of things.
I used Vim for 5 years before I eventually made the switch to Emacs. The reason I switched was because I needed an alternative to stop my hands from hurting all the time. Because having to slam every key at full force (because a missed input can wreak absolute havoc) was really taking its toll on both my hands. The combination of using standard Emacs bindings and the Dvorak keyboard layout have improved things significantly.
I think your case is an outlier - I think most people go the opposite direction specifically to escape issues with their wrists, but I suppose it is all very personal - depends on too many factors. Great thing is that Emacs is so flexible, it doesn't really care how you use your keyboard.
Embracing Evil has been totally worth it. My cursor now teleports around the buffer at the speed of thought.
Evil mode is fantastic. Not only am I fascinated by how nicely it works, I'm just impressed that it's never been a built-in feature of Emacs. It definitely doesn't feel that way. It feels like a baked-in, first-class thing.
Here's one thing about vim-navigation. Gary Bernhardt (the WAT talk guy) once said: "There's no vim-mode there's only Vim" and he was right - to a certain degree. All the different extensions and attempts to bring vim-navigation to non-vim editors have glaring deficiencies - all of them - VSCode doesn't fully vim, IntelliJ doesn't do it comprehensively, Sublime can't properly vim, etc. With one notable exception. Emacs actually vims better than vim/gvim/neovim. I'm saying this with the full-blown confidence of a die-hard vimmer.
The way Emacs implements Evil-mode and its extensions is the ultimate compliment to its design. If there's a model of a plane that can perform a vertical landing, yet never actually needs to use it, I would still love that model over any other planes, even if the feature is purely accidental. The fact that it can do so alone would be great evidence of amazing engineering. Evil-mode is absolutely one of the most celebrated achievements of Emacs, complementing other remarkable packages like Org, Magit and many others.
As an Emacs users who often tries to do as many things as possible in Emacs, I would say that the more stuff you can do in Emacs, the more the various features in Emacs compound with each other, giving you more utility.
For example, I use the Verb package for making HTTP requests. So with Emacs as my HTTP client, I can do bulk HTTP request calls with keyboard macros. The HTTP requests can be stored in org-mode. I can write custom Elisp for special authentication scenarios. I can create new commands if I need them.
For this example, I can imagine (haven't used this myself) scenarios like creating a keyboard macro to shave off the first X seconds of a video usable with dired.
Some non-text-editing things in Emacs that are actually extremely useful:
- Git via Magit
- Managing files with Dired
- Media player with Emms
- RSS feeds with elfeed
and the list goes on and on...
Using a well thought-out Emacs interface for anything is one of the biggest sources of joy in my technical life.Using well thought out interfaces is a joy wherever we find them.
Something in your comment made me remember a DOS based file "explorer". Screen split down the middle with a folder-tree and file list on both sides. I remember hardly ever turning on the computer without starting that for one task or another. That was some serious UI pleasure, at least for the time. Ha, found it:
https://handwiki.org/wiki/Software:File_Commander
Ah, the nostalgia!
Nostalgia no more! Midnight Commander/4DOS style file management can be achieved with Emacs Dired today and then some.
https://www.gnu.org/software/emacs/manual/html_node/emacs/Di...
For your consideration, I built a keyboard-driven menu interface for Dired called Casual to help with discovery. https://kickingvegas.github.io/casual/Dired.html
In my opinion Dired is the best way to rename files bar none (wdired-mode)...
I'd say this ain't an opinion - it's a fact. Where else can you rename a bunch of items in your directory tree, recursively, using all the features of your editor - multiple cursors, keyboard macros, spellchecking, etc.?
There just doesn't exist another piece of software (go ahead, prove me wrong) where you can edit your filesystem like a wiki page.
Getting deep enough into it, it basically becomes your shell, complete with the ability shells have to orchestrate multiple programs into a meta-program.
Not to mention the actual eshell, implementation, or the ability to use any other shell in one of several terminals.
An Emacs tool to trim video most likely has a conventional Emacs API, conventional Emacs documentation, and was developed using conventional Emacs user personas. Modulo the skill of the tool’s developer, this means it won’t require a lot of unnecessary brain cycles to learn or use or automate.
It won’t require switching to a browser. It won’t require creating an account. No going to the app store. No license consent. No dangerous program warning. No turn on notifications. No unlock premium features. No an update is available. No marketing emails. No cookies.
It’s just gonna STFU and do what it says it does in a way that makes sense. And if it is good enough, it’s good enough. It won’t add bullshit to your day.
And at under 400 lines of code, if you want to extend it or integrate it into an existing workflow, it's extremely straightforward to see what it's doing.
While I'm not an Emacs aficionado and I find some of the stuff that people squeeze into Emacs weird [0], I have to vouch for OP here. It's a front end for ffmpeg. ffmpeg is a text-based utility and Emacs is a text editor. That actually makes sense. And judging by the screengrab it's a lot more ergonomic than plain ffmpeg. If I were an Emacs user I'd definitely consider using this, and it makes me kind of jealous.
[0] recent example from here: a proto social network that runs via org-files-over-http (as if we didn't have a markup language designed for http already) https://news.ycombinator.com/item?id=44889354
> if we didn't have a markup language designed for http already
Org-mode is far more than just a markup. It is executable - you can have executable code-blocks (in different languages) that interact with one another. It is interactive - there are TODO items, agendas, and scheduling that integrate with your workflow. It has built-in calendar, deadlines, and habit tracking. It has spreadsheets with calculations, like in Excel. It is insanely programmable. I use it for various things, even some unexpected like managing my dotfiles - simpler and more predictable than Nix or Stowed, org-mode creates an 'immutable' version of my system.
Sure, it is also a markup, but the markup is just the interface to a much richer computational document model.
So, what you're finding to be weird is only because you are unfamiliar with it. It is in fact highly pragmatic, and there's nothing weird about it; you just have not experienced that firsthand, and that's alright.
I get that Org-mode is extremely powerful, but I was talking about Org-social specifically. Take a look at the spec, does it use much programmability? To me it looks like just annotating a bunch of metadata plus a unique ID (which is actually just a timestamp, which seems problematic to me for a number of reasons, eg tracking edits, not being necessarily unique,...).
I don't understand what you're saying. If everyone on the team uses Excel to manipulate data and they share it around in .xlsx files, you wouldn't tell them "why not .csv?", right?
I'd say it's more like they're sending around csv tables in the body of emails and then writing VBA scripts to copy them into Excel. In that case, yeah, I might mention that there are better ways to do it.
There's some truth to the aphorism, "Emacs is a great operating system... if only it had a decent text editor."
I think Emacs is basically an elisp runtime that happens to have primitives like buffers, windows, etc upon which a text editor happened to be implemented.
It's more like a programming environment than a text editor. Sort of like Pharo Smalltalk, for example.
You can implement an HTTP server in elisp. You can render SVG, HTML, PDF. All kinds of things.
This is the answer.
Emacs isn't an editor. It has an editor. And a bunch of other stuff. The core is written in C, but that's mostly a Lisp runtime and a display system. Everything else is written in elisp. If the runtime doesn't give you what you need, you can load dynamic libraries to extend its functionality.
lol, logged in to say the same thing!
I found for me that the epiphany came when I realised three things:
1. Key bindings are just calling Emacs functions in the current runtime, which you yourself can call from Elisp
2. Holy shit, you mean every keystroke is ALSO just a function that you can call yourself meaning you can automate everything with Elisp?!!
3. Wait. Emacs is just an Elisp runtime where some of the functions can edit text buffers!!!!
Why is this cool? Because it means that Emacs is NOT an editor - it’s a virtual machine holding libraries of functions that do useful things, which YOU then customise into YOUR editor.
In other words - Emacs is a toolkit that allows you creator your own editor/environment, customised to your specific workflow. And if you don’t like it, you have the power to fix it yourself, which is in contrast to every other editor I know of which was built by the editor developers with their own idea of how you should edit text
To go along with (2), "C-h k <KEY SEQUENCE>" and "M-x view-lossage" are excellent starting points for investigating what any key stroke means. From there, one can follow links in function and variable help all the way to the relevant elisp definitions.
If only that ease of hood-popping were more common.
This.
I’m a Rust dev so Zed looked like a win for me (my Elisp ain’t that good), but it doesn’t have the same immediate extensibility that you get used to… and sadly it doesn’t run inside containers because it needs accelerated video :sad face:
The flaw in that metaphor is that elisp is a pretty suboptimal programming language for general-purpose programming. The standard library (in my limited experience) seems to use buffers as the base primitive and doesn’t help you very much if you want to do anything complicated without touching the current buffer.
This is a common misunderstanding about buffers. Buffers are the base primitive for text manipulation for a good reason; it’s a deliberate design decision not a handicap or a straitjacket. Think of a buffer as a string with a cursor in it, where it is always easy to manipulate the text at the cursor. (It’s implemented using a gap buffer <https://en.wikipedia.org/wiki/Gap_buffer>, but you don’t need to know that.)
The operations you can do on a buffer include not just the usual string primitives like insertion and deletion of text, but _any_ editing command that you could use as a user as well. For example, if you want to move the cursor to the beginning of the line, call `beginning-of-line`. This is exactly the same function that is bound to `C-a`. Want to move to the next line? That’s `next-line`, which is bound to the `down` key by default. Want to drop the mark at the cursor position? Call `set-mark`. Want to search for something? `re-search-forward`. Now that you’ve found what you were looking for, you want to remove it from the buffer? Call `kill-region`, same as if you had typed `C-w`.
And commands build on other, more primitive, commands to give you complex behaviors. There are commands for creating, parsing, and sending emails, making HTTP requests and parsing HTTP responses, creating and parsing JSON, XML or HTML, etc, etc. You can create some JSON in the current buffer, send it off to the server via HTTP, and when the response comes back it swaps you over to a new buffer with the response. Or you can ask it to parse the response and just give you the body, etc. Basically any command you could interactively use as an Emacs user will work as part of a new Elisp program simply by virtue of the fact that it works on the current buffer. And the new Elisp programs you write can be used as commands by the user, and as parts of the user’s next Elisp program.
And switching buffers it not slow; all the buffers are in memory at the same time and the “current” buffer is just a pointer. The only quirk is that the pointer is stored in a variable instead of being passed as an argument to every single command you run. And that’s a good thing, because you would soon get tired of passing the current buffer to every single function you call!
I hadn't even realized how much I'd gotten used to emacs' way of thinking about buffers until I tried automating Google Docs.
... What a nightmare. Everything is an object. A header is an object. A paragraph is an object. There's a three-deep hierarchy to start talking about the current document. Yes, it's nice and namespaced and in that sense is well-defined, but the "hello world" of inserting text at the current cursor position is an absolute nightmare. And if you want to insert something more complex, like a couple headers and a paragraph and maybe a table? Get ready to build a factory function that creates a bunch of stuff and glues it together like you're writing a UI in Java AWT. And then it's not even in the doc yet, you have to go find your cursor, find the doc element the cursor is in, and only then can you insert content via a reparenting operation.
In emacs, you could do all of that with repeated "insert" calls, nearly literally touching the same keys you'd use to do it in the editor. It's an almost 1-to-1 metaphor mapping. If you know how to write text in emacs you know half of what you need to script emacs.
Lego is a "programming environment," so avoid the obvious contrarian nit of "must be more general," and accept there's no better language-environment combo for constructing workflows than elisp and emacs -- yes, it's leaps better than bash and term.
There is: my OS plus Python, Ruby, even JavaScript, or any other modern scripting language. macOS even supports Emacs keys globally!
You're confused on both points:
First of all, macOS doesn't "support Emacs keys" - those are readline/bash keybindings (C-a, C-e, C-k, etc.), not even partial Emacs navigation. The distinction matters. Emacs is inherently a modal editor, and no OS provides that aspect out of the box.
Secondly, although it sounds reasonable in theory, in practice it just doesn't manifest to the same level - because of the enormous context switching cost. While Python/Ruby/JS are excellent languages, using them for workflow automation typically means:
- Fragmented toolchain: Editor → terminal → file manager → browser → back to editor
- State loss: Each tool maintains separate state, history, and context
- Interface friction: Different keybindings, different ways to access data
Emacs provides unified state and interface - your scripts can directly manipulate buffers, access file system, interact with running processes, and integrate with your editing session. The "programming environment" aspect means your automation tools live in the same space as your work.
The fallacy is treating this as purely a language comparison when it's really about environmental integration. A Python script that opens files is fundamentally different from an Emacs function that operates on buffers you're already working with.
For personal workflow automation where you're already living in Emacs, the integration advantage is real.
Here some practical examples that would be just outright painful to achieve with a general-purpose PLs.
- Grab url from browser, insert formatted markdown link at point
- Extract all TODO items from project files, create agenda in new buffer (I can probably do it in fewer than 15 lines of Elisp without ever having to save, lint, compile that code)
- You're editing a CSV, write a function that operates on the current line/region and transforms it in place
- Mid-email composition, grab a code snippet from the adjacent buffer, format it, and insert
- While reviewing a log file, extract error patterns and automatically open related source files
Your automation remembers what files you had open, your cursor positions, your window layout. Scripts can modify your current work context rather than creating separate outputs
With Python/shell scripts, you'd need complex IPC, temporary files, external tools to achieve similar seamless integration with your active work session. That's why majority of programmers just don't even bother to think to try. Experienced Emacs hackers wouldn't even blink - they'd start whipping up Elisp like a chef would crack eggs to make an omelette.
Don't really see how the string (and other usual container types) or filesystem APIs are lacking in any significant way compared to stdlibs of other scripting languages.
I also believe that buffer as an abstraction strictly makes many harder things easier, to the point I often wonder about creating a native library based on elisp buffer manipulation APIs alone that could be embedded in other runtimes instead. So the without touching buffer is a premise/constraint I don't quite understand to begin with.
That's actually the zen of programming emacs: don't avoid using buffers; create as many of them as you need.
"But that's like opening a document every time I want to glue two strings together!"
Not at all. A buffer is just a fancy blob of RAM. It's not file-backed unless you make it file-backed. They do take up RAM, but you're programming on a modern computer, not a PDP-11; if you're comfortable with Python using a whole in-memory object to represent an integer, you're comfortable with buffers.
"But it's messy to leave them lying around."
It's a feature. Yes, buffers aren't well-encapsulated and if your program crashes mid-run they get left open. That's by design. You don't need encapsulation because you're not doing multithreading here (and if you are, there are primitives for that and they take a bit more work to use); emacs is for editing and there's only one you, so if the current program is creating buffers and has no way to run two copies of itself at once, who cares. And your program crashing leaving buffers around is a feature; you can inspect the buffer and see what it looked like at crash-time, or set up the buffers the way you want them before firing off the program to get the desired effect (try those tricks with most languages without slapping on a debugger). And there are scripting blocks to create temp buffers and clean up your buffers for you anyway.
"But it's weird to have two ways to talk about strings in the language!"
That's true; it's a bit weird to have the string primitives and also buffers. But that's a pretty common flavor of weird; Java has strings and also has StringBuilder. My rule of thumb is "any time I'd reach for StringBuilder in Java, I should probably consider using a buffer in elisp."
I agree with you, therefore I am pretty sure you meant to reply to the parent I was also replying to.
Confirmed. I wasn't disagreeing with you; it was a "yes-and" to what you were saying.
> elisp is a pretty suboptimal programming language for general-purpose programming.
Well, because it ain't. it isn't a general-purpose language. It serves a single, specific purpose and excels at that function remarkably well.
> if you want to do anything complicated
Then you'd delegate the task to more specialized tools, possibly written in general-purpose PLs. Which Elisp is not.
I was responding to the argument that Emacs is "a great operating system... if only it had a decent text editor." Not such a great operating system if its native language only works well for manipulating its could-be-better text editor.
The first part of that joke is an exaggeration. The second part of "not-so-great editor" is simply incorrect.
Emacs does provide some OS-like features - process management, file system interface, window management, runtime environment, but it lacks tons of other things to be even close to an OS - there's no direct hardware control, no memory protection between different parts, no multi-user support with security isolation, no device drivers, no network stack management, etc.
The "lacks a decent text editor" part is more unfair than the OS comparison. Emacs objectively has a very capable editor - stating otherwise is a sign of unfamiliarity and ignorance about it.
The joke is a relic from the 1990s and it's aimed to capture how Emacs (used to) prioritize power and extensibility over immediate usability - making it simultaneously impressive and frustrating - back in the day.
The joke is hilariously outdated along with another one - "8MB and constantly swapping" - Emacs went from resource hog to surprisingly lightweight without changing much - the world just got more bloated around it.
I'm just baffled why programmers are so notorious for holding onto outdated conventional beliefs that no longer hold any truth about them. Especially for cases like this, when it was clearly a joke. A joke that has not aged well at all.
Absolutely, I've been a die-hard Emacs user since about 2007 or so. I was a vim user for about ten years or so before that. It's absolutely an out-dated joke. Don't take it seriously.
It's not an OS. The text editor is great.
I was just using it to illustrate a point.
In this case, I'd view it more as an interactive mode to use ffmpeg?
That is, it isn't like emacs is the thing that is doing the trimming. It is just providing convenient access to ffmpeg to do that. That it is able to do this using roughly 300 lines of code is quite impressive and largely speaks to why people love doing things in emacs.
It would be one thing if this was code golfed to get to a working state. Reading the code, it is remarkably straight forward interactions with ffmpeg.
Emacs more like a platform like DOS or the Terminal/Shell/TUI combination than an editor like Vim/Micro. The wealth of libraries, all centered around the concept of buffers and windows, make it easy to integrate pretty much any other tools.
Is it an REPL? use comint.
Is it a tool that act on text files (lint, test,...)? Use compile
Do you need input with completion? Use the minibuffer.
Do you need multichoice selection? Use a buffer and mark stuff (there's a mode that you can extend from if you need to display tabulated data).
Do you need to define flags on the fly? Use transient.
Network request? Calling shell command? A combination of all the above? Emacs got your back.
And because it's a live programming environment, you can start quickly with a prototype (or just altering stuff) and then tweak things until you have a proper package.
To me the point is that Emacs is a customizable environment that allows you to whip up stuff like that fairly easily, and have it integrate with arbitrary other Emacs stuff. Standalone desktop programs are each their own separate little worlds. Emacs is a more integrated environment in that sense, compared to mainstream operating systems.
I'm not really the type of person to do video editing or web browsing in Emacs, but I can still see the appeal.
A well-tuned emacs install is comfortable. I have my keybindings that do what I want them to do. I can visually organize my emacs frame (what is now called a GUI window) exactly how I want, with files taking up the parts of the screen that I want. I can be reading the README of some project I checked out and be curious about some terms, then just select it and send it off to my LLM. It's trivial to switch between Claude, OpenAI/ChatGPT, and Gemini depending on how much context I need to give.
It's like having personal space organized to your tastes. For some, their personal space can seem on the outside as a warzone of stuff, for others it's meticulously organized and labelled, but the key commonality is that it's personal space and that the owner of the space is comfortable in it. That's what emacs is. I don't need to learn a new set of keybindings or mouse clicks to unlock new functionality, I can just bring it into emacs.
Great comment, although I use emacs for everything code, writing, finanaces, task management still all these things are text so I don't get using emacs for non text things
> I don't get using emacs for non text things
What do you mean by "non-text things"? You are dealing with the computer, it's all about text and mostly text. Sure, it might be encoded and digitized, but even structured binary - is all just text. Even when you give a computer voice commands - they are just synthesized audio form of fucking text. Even with "turtles all the way down" - it's all turtles made of text.
Have you seen the gif in the blogpost? With the transient that has "Move Forward/Backward", "Increase", etc. commands? The commands that you'd have to send to the specialized app anyway - Emacs or not. In what form? Fucking text, of course.
with the computer, it's all about text.
Boy, are you going to be blown away by Pac-Man.
First Pac-man was written for Zilog Z80 microprocessor in Assembly. What do you think Assembly looks like? Sequence of emojis?
I would call a sequence of emojis a form of text too!
Everything can be reduced to text. Sure, I'm of course pushing it here with my "all digital information reduces to bits, and thus could be text", but the meaningful processing requires understanding the inherent structure and relationships within that data.
It's like arguing that "all books are just sequences of letters". That's technically true, but meaningless without understanding grammar, semantics, and context.
What I'm saying is akin to: "First step to understanding all the books starts with understanding letters..."
Anyway, emojis are of course text - even though they are stored as encodings. For example, LLMs process them exactly like any other text characters - they're tokenized, embedded, and handled through the same mechanisms as words. I should've use a different analogy to make my point clear, but you know what I meant.
But how does playing pac-man make especial sense in text?
Well, in the context of the discussion, you can "teach" Emacs to play Pacman. Imagine sending left/right/up/down commands to a Pac-Man emulator or whatever. The emulator itself may not "understand" these commands in pure text, accepting some digital form of them, but whatever format it accepts, it probably can be reduced to sequences of alphanumerical characters.
Similarly, when the emulator broadcasts current coordinates for pieces, or sprites of them - they still can be reduced to plain text.
As a matter of fact, if you want to play Pacman in Emacs... you can just play Pacman in Emacs: https://github.com/emacsmirror/pacmacs