280 comments

[ 0.28 ms ] story [ 152 ms ] thread
What is a good tool that's invisible? I'm genuinely curious. All tools I've used are either simple and heavily limited (so, not "invisible" because hard things are hard) or powerful but heavily specialized (so, not "invisible" because the learning curve is very evident). I feel the trade off is inescapable.
That's just it though isn't it. Good tools that are invisible to you won't easily come to mind because they tend to be, well, invisible.

It's not until you randomly end up on a system which doesn't have that tool that its usefulness becomes visible; and I mean really visible.

I think this is really insightful. Every "good and invisible" tool I thought of fit neatly into one of those two categories. Examples:

Powerful and specialized: automatic transmission, display/monitors

Simple and limited: syntax highlighting, deterministic autocomplete

The closest ones imo that bridge the gap: ssh, google search

A tilling window manager is a fantastic tool that is close to invisible.

Though I don’t agree with the author. Visibility isn’t what matters, if you get comfortable with a specialized tool like a CAD software, or a game engine studio like Unreal, it’s not invisible at all but your brain will stop focusing on all the noise on your screen and you become pretty focused and productive. I live emacs, but Rider is also a fantastic editor.

Though I would love for things like LLMs to be way more out of your way, more “invisible”, more tool like. I hate the current UX of having to tame a patronizing, annoying fake human just to get things done the way I want them to be done

(comment deleted)
A good tool is invisible such that it is highly opinionated and nails the 80, 90, 99% use cases in terms of making assumptions regarding logical defaults.

Restated, the tool understands the process and what a “good” result/outcome looks like. It correctly presumes relevant and important information (especially given the current stage of your full task), and can “fill the gaps” between start and finish.

A good tool can distinguish between what you wanted, what you thought you wanted, and what you “should have” wanted.

A good tool makes it easy to do the “right” thing and hard to do the “wrong” thing.

A good tool doesn’t function to be understood, but to not be misunderstood.

I have spent a lot of time sitting in this question, having spent years creating design and drafting automation tools for architects, designers, and engineers in the building-design industry.

An invisible hammer would be more prone to land on your toe.
Sublime is a very good editor indeed.
Good Editors are Invisible would make more sense. I think this only applies to the class of tools we would call "controllers"
Well this is a take.

It’s weird how much the author fixates on Vim being “visible” and implies multiple cursors and features in Sublime aren’t. Just because your brain is trained to not think about it anymore doesn’t make it any less visible.

Multiple cursors aren’t a native feature in many tools, it is still something to learn how to use, let alone effectively — just as Vim key bindings are. Plus, vim is more than just a TUI choice for terminal-only users, it’s key bindings for people that have learned that a keyboard is a natural extension of themselves and would rather not jump back and forth to mice repeatedly — just as “multiple cursors” can be to a sublime user of 15 years.

What I find especially weird is that I'm not sure I've ever heard anyone describe vim as a puzzle that's fun to solve. The most common sentiment is that it has a learning curve, but ends up being worth it.
> I'm not sure I've ever heard anyone describe vim as a puzzle that's fun to solve.

Search for “vim puzzle” and you’ll find entire websites dedicated to it. Here’s a random one: https://vimventure.dev/

Specific enthusiasts enjoying something is different from telling beginners that "vim is a fun puzzle to solve".
My intro to vim was a guy using some kind of web browser in vim, or maybe it was a browser with vim controls, and I was like wtf. But I did end up using vim for just code/text editing without any fancy macros, it was worth.
I don't think of vim as a puzzle, but I do use it because I find it fun to use in some ineffable way. Note that I also don't claim that it makes me more productive; I use it because it sparks joy, regardless of however productive it makes me.
Agreed. I used to enjoy vim macros, but ever since switching to Helix I reach for its multiple cursors all the time and barely use its macros. But that doesn’t mean multiple cursors don’t have a learning curve, I still need to think of he method to place the cursors in the right places.
I think I noticed halfway through reading that most of this is AI nonsense.
Ginger Bill is not AI-friendly so that's absurd.
That's not what I was saying. I used vim macros specifically as an example, not Vim as a whole.

> I’ve had people tell me how “fun” it was to build a macro to handle some one-off text-refactoring problem. But when I looked at what they were doing and how long it took, my honest reaction was: I could have done that in Sublime in a minute with multiple cursors, or just written a quick script.

and

> What baffles me is that so many people treat that friction—the effort of working around a tool’s limitations—as the “fun” part, and then advertise it as evidence that the tool is great.

If you can affectively use vim macros, then GREAT! But if you cannot, even with using vim for decades, then please don't advertise them as the "fun" part.

The things about multiple cursors is that you think about the processing while doing it, while most people using macros looks at the structure of the text first and then devise the macro. I wouldn’t say the latter is faster, but it’s a different mindset.

And the other thing is that vim has the “dot” command to repeat your last edit. Similar to macros, you think about your local edit first, then about where to repeat it (usually tied to the next item in the search list).

Exactly. And I'm no purist - I'm happy to use "dot" with a mouse if I want to easily repeat an edit in tens of places if they're not nicely aligned or searchable.
One of the things about Emacs and Vim is that you have commands that does things. They all have the same conceptual model. In vim, you have the text objects, the motions, and the counts (and more advanced ones like line and pattern addressing). In emacs, you have the point, the mark, and the arguments (including the universal one) (the advanced ones are which modes are currently active). That’s mostly the internal state that matters when you think about an edit which changes A to B.

You think about the evolution of the internal state and the suitable commands just appears, just like you think of an idea and the suitable words appears. Learning commands is like expanding your vocabulary, not learning how to speak. Learning how to speak is internalizing the aforementioned conceptual model.

> The things about multiple cursors is that you think about the processing while doing it

That visual feedback is EXTREMELY useful because I learn of the edge cases to what I am editing in bulk (usually formatting code or tables or whatever) as I am editing it. When you do a macro, you have to try and get it right, and then try again from the start each time to get it right. `dot` et al are not enough in that regard. So the multiple cursors approach is better not because it's a different mindset, but it produces a different feedback loop to correct mistakes.

If you still prefer the macro approach over the multiple cursors approach, then you do you. But as an example in the article, I have seen people think they are being productive by their own standards, and they really aren't.

> That visual feedback is EXTREMELY useful because I learn of the edge cases to what I am editing in bulk (usually formatting code or tables or whatever) as I am editing it

I do not disagree with that

> When you do a macro, you have to try and get it right, and then try again from the start each time to get it right.

But you are wrong in that, because you assume that visual feedbacks are necessary. They are useful. Using vim and the likes is very much like playing the piano or driving a car. You’re always one step ahead of your actions because translating intent into operations is effortless as they are ingrained in muscle memories. I don’t even look at the cursor much of the time because it will be where I need it. I don’t care for mistakes because they are easily corrected.

Even then, I rarely use macros because they are at the high end of the power spectrum. Only writing your own commands is higher on the list. Easy macros are easy to create, powerful macros are created only when necessary and are worth the carefulness. I don’t think there’s nothing similar to named registers and emacs counters with multiple cursors solutions. Or the ability to have multiple macros ready to go at anytime (very useful for data cleanup).

You're over-fixating on the misuse of macros and generalize that to make a statement about Vim, almost as if that's the only useful feature in Vim. Despite the cop-outs. More basic editing commands are much simpler, quicker, powerful, and what's actually used most of the time.

Also, getting bulk editing perfect, including the edge cases, is inefficient regardless of the tools you use. For the majority of multiple cursors' target scenarios, I would just combine simple search and replace (cgn), dot repeat (.), and undo plus skip (un) for the edge cases. Then jump back (N) to the edge cases and make manual edits. It's quick, you have instant visual feedback, and requires less cognitive work than trying to process it all at once. And that's the approach people likely have in mind when they mention dot repeat.

> I’ve had people tell me how “fun” it was to build a macro to handle some one-off text-refactoring problem.

I can't relate, either as a Vim user myself or having heard other users.

To the extent that it happens, it's surely because the macro can be seen as a sort of programming. Vim offers you two esoteric programming languages, if you want to see them that way: vimscript obviously, and the simple concatenation of Vim commands. But any system consisting of a text editor plus a way to record and play back its commands gives you the latter. Vim isn't doing anything special to create that second esolang; it's just bundling the playback mechanism.

But that rather is the point: creating the macro is as much "scripting" as actually using vimscript is. Not only is it recorded in an at-register, but it can be stored as plain text in a vimrc file. It should be compared to "written a quick script" and not to "used multiple cursors"; and any sensible Vim user would have a different approach (commonly powered by :%s/foo/bar/g , perhaps with backreferences) to the cases where Sublime's multiple cursors shine. (Yes, you can use visual-block across multiple lines if everything lines up; and yes, it's inferior to a real multiple-cursor system; and no, I don't think I've ever personally had a use case for it.)

There are people who reach a level of proficiency where they enjoy the challenge of an intentionally difficult to use programming language. Vim macros are accidentally a programming language, and definitely not intentionally difficult. And using them to "handle some one-off text-refactoring problem" is entirely missing the point, and a sign that one has more room to grow in proficiency and a lot more room in wisdom.

In short, the people you've heard this from should not at all be taken as representative of Vim users.

From the article:

> multiple cursors really are better than macros 99.999% of the time (since they give direct visual feedback)

I don't know what he means, vim macros also give direct visual feedback while writing them. You just edit as normal while recording, and replay those edits later. I think it is technically possible to write a macro without seeing the live effect on the text as you write it, but I've never done that.

I looked up multiple cursors out of interest, I guess the advantage is that it's one interface that is easy to explain. I would use multiple vim commands to replace it in practice.

I'll agree that multiple cursors are maybe better than macros for most of the things that someone would use multiple cursors for, but usually I wouldn't use macro's.

But I think most of the things I do with macro's cannot be done with multiple cursors.

I would be very interested in being proven wrong, if someone has some examples of "this is where multiple cursors are great, and vim doesn't have a good alternative".

> You just edit as normal while recording, and replay those edits later.

And there is the problem. The first time you do the edit, it might be fine, but when you make a mistake in the edit, you then have to go back and correct all of the cases. With multiple cursors, I am seeing instant visual feedback on all instances of the cursor at once. I am getting literally 2D spatial information, compared to the 1D spatial information per each replay. The multiple cursors approach is better not because it's a different mindset or whatever, but rather it produces a different feedback loop to correct mistakes.

If you still prefer the macro approach over the multiple cursors approach, then you do you. But as an example in the article, I have seen people think they are being productive by their own standards, and they really aren't.

Its weird because vim has multiple cursor mode as well
As a long time terminal user, it does not surprise me much when people just don't get it. The discussion often goes like this:

— In a terminal, I can do so-and-so with a simple command

— Well, in my FrobnicatorStudio, there's a shortcut Ctrl+Alt+So for that

and this can go forever, going into pretty much useless comparisons like "in vim, I can delete 24 lines by pressing four keys" (no Sublime user ever needs that) vs "in Sublime I have multiple cursors" (no vim user ever needs that either).

The proper argument here, probably, is this one: the terminal, with its way of combining small CLI tools into pipelines, covers infinitely many use cases, but indeed has a learning curve, taking probably a year or so to become really comfortable. When you reach that point, you will be, on average, much more productive than an average GUI user, but it requires some dedication, pain, and suffering to reach that point, and people often do it involuntarily.

In my case, my first job required managing customers' servers over ssh, those servers had bare minimum installed (often vi, not vim), and I had no choice other than figuring out how to do things effectively in this setup. If not for that experience, I'm not sure I would've gone through the pain of starting doing things in the terminal.

Recently revamped my terminal setup after all IDEs have just gotten painfully slow to work with (the debugger + git integration in intellij was my last moat, but spend some time to learn nvim-dap + lazygit and it's excellent). AI has been immensely helpful here too to figure out the long tail of weird config gotchas.

Also thanks confirming the multiple cursor YAGNI for vim, could never wrap my head around needing it in the first place.

Exactly this. The non-composability and non-standardization of GUI tooling is my main issue with them ; having the same toolkit available to solve every problem takes some doing but is ultimately more efficient.

That being said, it's a hard sell. It's not easy to grok the simplicity of the commandline tools until you've used them to solve what would otherwise be an intractable problem.

Yes, any GUI that doesn't provide any kind of RPC or composable API layer is almost a lost cause to me. I'd personally refuse to use it. With a caveat, though: on MacOS, which I absolutely abhorred in the beginning, having now been required to use for work (instead of Linux), I found the beauty of OSA (Open Scripting Architecture). Holy mother of Turing, I wish there was anything similar on Linux. I had no idea how amazing this thing was. I can fearlessly dig things out of even complex UIs for automation in ways that I can't ever dream to be able to do on Wayland.
If we make a distinction between CLI apps and TUI apps, my interpretation is that the article was specifically talking about the latter.

By a CLI app (with the emphasis on command line) I mean something like grep, sort, cp, git, ls, tar, etc. The normal way of interacting with these is by writing commands on the shell, which means that if you know how to use it normally, you can also use it in a script. Which means that you can combine these into pipelines.

By a TUI app I mean (and I think the article means) something like Vim, Emacs, Tmux, Lynx, Tig, Midnight Commander, Claude Code, etc. - an interactive app that takes over your terminal while you're using it. You're not going to compose those into a pipeline. Or to be more precise, you're not going to use them in pipeline by using them the way you normally use them. If you can use them, it's probably because the app decided to provide a command-line interface in addition to the TUI.

Agreed about the difference between CLI and TUI; at the same time, I do indeed prefer TUI over the “normal” (window) GUI apps for the exact reason why I would prefer vim (or emacs for the other half) over a GUI editor: when you are already in the terminal, launching a TUI app is just faster than switching to a GUI window. So it's still about "terminal or not" for me, or even, what is your default starting point: is it a desktop with icons or menus, or a command line with a prompt? For me it's a terminal, so I prefer TUI apps.

...but not Midnight Commander: it's an outlier in your list, a tool that actively prevents you from learning the way how things work in terminal. Same for all attempts to invent a UI for git.

> when you are already in the terminal, launching a TUI app is just faster than switching to a GUI window. So it's still about "terminal or not" for me

I’m principally a terminal person too, but my first thought was tmux cut/paste buffer (to transfer data whether TUI or CLI), not speed-of-launch.

You should not underestimate how confusing those CLI tools are to people who have never used them before.

For example, I would argue that for someone with no experience, figuring out how to copy a file from one folder to another is easier in Windows Explorer than learning how to use cp.

> For example, I would argue that for someone with no experience, figuring out how to copy a file from one folder to another is easier in Windows Explorer than learning how to use cp.

I don't believe this.

If you find a person (well, two I guess for this experiment) with no computer experience and want to teach them how to copy files, your first step will be teaching them what is a file and how they are organized in the computer.

Explaining what a file is takes the same amount of time for both cases (we can ignore how devices and processes are files in Linux and how files in Windows contain many data streams and extra metadata).

In both cases you need to teach them the file system is hierarchical and folders can be nested and can contain files.

For Windows you have to teach them how to double click to open folders. They can double click "My Downloads" to see their downloads. They can double click "My Music" to see their music files.

For the CLI you have to teach them that `ls` can list the contents of a directory. They can `ls Downloads` to see their downloads. They can `ls Music` to see their music files.

For Windows you then teach them they can open multiple windows (assuming you want to copy from one folder to another folder). And you teach them they can click, hold and drag and drop a file to move it (but sometimes it will be copied when they do that) and they can hold in Control while dropping to copy the file to the destination instead. Or you teach them they can use Ctrl+C to mark a file for being copied and then navigate to the destination and use Ctrl+V to copy the file. Or you teach them to right click for the right click menu, and that "copy" means "mark this file for being copied", and that a right click in the middle of a window displaying the target folder lets them select "paste" which means "copy the marked file here".

For the CLI you teach them `cp Downloads/foo.mp3 Music/` copies foo.mp3 from their downloads to their music directory.

The CLI is also infinitely easier to help newbies use over the phone!

My mom struggled to understand the concept of copying and pasting when she got her first computer at home, with Windows. It was more than 20 years ago, but I think the idea that you need to copy in one place, then go to some other place and paste there, still sometimes confuses her in the context of files, even though she does not have any issues with that when copy-pasting texts.
Look I’m a big fan of having CLI interfaces, and they can definitely let you do things that you just can’t do (or are extremely difficult to do) with a standard desktop gui. But at the same time, the GUI means they never have to learn that `cp Downloads/foo.mp3 Music /` will give them a cryptic error that Music can’t be found. Or that if they’re already in the Downloads directory then they need to instead type `cp foo.mp3 ../Music/`, or that they’re going to need to figure out the special way to tell the computer what they mean when they want to do `cp Downloads/foo bar (feat. baz and the fizzbuzzes).mp3 Music/` and that doesn’t work when they type it in.

The initial explanation of the happy path might be slightly longer to teach drag and drop or right click copy and paste for files, but that happy path will also deal with a lot more scenarios in the exact same way than the happy path cli commands will.

I've been working with the command line for just under two decades. A couple of years of those were spent with vim as my primary editor, but eventually I moved to Sublime and never looked back.

But I still use the command line heavily in all my work. I usually have a konsole window that I alt+tab into whenever I need to build or run tests, instead of using Sublime's "build system" support. The only time I use vim is when I need to ssh, or am using Termux on my phone.

> The proper argument here, probably, is this one: the terminal, with its way of combining small CLI tools into pipelines, covers infinitely many use cases,

Extensible GUI tools (Sublime, VSCode, etc) cover infinitely many use cases too, except they offer more reliable and reproducible runtime environments.

I think the reason these types of discussions never die is because people in general tend towards closed mindedness. It's hard to put yourself in other people's shoes, and even harder to entertain the possibility that you're wrong.

But at the end of the day this only matters for novices. After enough experience with them, no matter what you use, your productivity bottleneck isn't going to be your tools (unless its ed...).

> I think the reason these types of discussions never die is because people in general tend towards closed mindedness. It's hard to put yourself in other people's shoes, and even harder to entertain the possibility that you're wrong.

I think the real reason is that people are used to GUIs who see the "harder tools" cannot entertain the possibility that they are wrong, and see the need to constantly make these hit posts to validate themselves. I have _never_ seen a vitriolic post made by a vim/emacs/tmux/etc. user telling users to switch over - I have seen countless by the "other side". I myself switched to terminal native workflows, not because of one of these posts but despite them, seeing how people who actually used these tools came off way more positive and seemed to enjoy their work way more than I saw from people who used e.g. VS Code and endlessly complained about anything not fitting into their worldview. It's exhausting and provokes no real discussion - nobody is actually being swayed by them, and it just adds fuel to the fire, letting people with opinions swing them around

I don't think your logic is off, but I also think that the FrobnosticatorStudio people have a point. The thing is, yes, the terminal gives you infinitely more capabilities but you probably have like, 20 actual things you do regularly? The learning curve makes it a hard sell when those 20 things are probably all you need. Like, sometimes I'll do something like this if I'm in a terminal and I want to find a build script

    cat packages.json | jq .scripts
And that's useful if I'm in the terminal, but if I'm in VSCode I'll just do

    ctrl-p -> packages.json <enter> -> ctrl-f -> scr
It's actually fewer keystrokes.

I dunno, I've learned that people's workflows are really personal so I'd never tell someone to switch their's, but for me I prefer tools that understand the structure of my project instead of just treating it like text, so IDEs are a preference for me.

I agree that both approaches are equally fast, and I myself did use VS Code at work a lot before the agents became widespread, so I can imagine myself doing either options. The terminal version is still less keystrokes because of the tab completion or reverse-i-search, but that's nitpicking.

> people's workflows are really personal so I'd never tell someone to switch their's

I regularly, especially when working with younger colleagues at work, find myself struggling to look at how slow they are in the terminal, like when they hit the up arrow 20 times to find the specific command in the history. If I have a close enough relationship with a person to make sure my advice won't be considered rude, I'd probably say “Ctrl+R and then type”, or even “let me show you how I would do it faster”, but doing this too often is borderline rude, so sometimes I just watch and feel bad for them.

I've seen it with seniors too. The smartest person I worked with (by far!) used to constantly use the menus in Visual Studio (OG Visual Studio, not code) for basically every operation. It was incredibly painful to watch. Watching him debug was a nightmare.

The second smartest guy I worked with couldn't really type properly. (He'd use two fingers). He was still a fantastic coder.

The thing is though, it kind of didn't matter because the value these guys provided was with their incredibly high intelligence, and the friction with how they interacted with tools was more of an issue on the margins than a big deal.

I think for people solving easier problems than these guys (who were working on legitimately hard problems), like, a webdev fixing frontend code, tools might matter a lot because there's less thinking and more navigating and typing. So context matters here a lot. But I definitely don't think you get to be an amazing programmer by CLI mastery (it definitely helps, but it's not a requirement)

Ctrl-shift-o -> scr is what I use. I love symbol navigation :)
My usual thought on this is that I don't want to get stuck at ctrlp ctrlf level. I always pick a tool that gives an intermediate expressiveness level even if it means a bit more efforts.. especially if it's not gui because I can reuse and compose it.

For instance jq falls too far on the capabilities curve. It's a nuclear weapon but it's almost a programming language and I never can keep the operators in mind (even though I loved the idea at first).

> it's almost a programming language

It is a programming language. That thing you write between single quotation marks when you invoke jq is a program. (And like with other programming languages, it's often useful to write your jq programs to files instead of always writing them inline in the shell.)

I love jq, though. It provides an extremely good language for its task, even if I often have to take a look at the manual when writing an interesting jq program.

fwiw, Clojure pretty much replaced jq in my toolbelt. Dealing with EDN is so much gratifying - it's almost twice more compact than JSON, it's far more readable; filtering, grouping, sorting, slicing data is so much more straightforward and actually composable, not to mention that I get to do that interactively, directly from my editor.
My shell is configured to show me previews of commands that match from my history. Depending on how long ago I typed the cat command, it might be "cat -> tab -> return"
I have used and use both regularly. The IDE makes the normal stuff really fast, but the CLI enables things that just can't be done in the IDE. I quite often ended up being the guy that dealt with things quickly, especially in an emergency. I just had the tools to get things done quickly, even when I hadn't been in that situation before. And I say that without even being good at awk and sed, which are used a lot by others in those situations. I always meant to get good at them, but never did. I ended up using other simpler tools instead to get the same kinds of things done.

In short, knowing the CLI way is absolutely useful, even if you use the IDE for 95% of stuff. And I also don't recommend going full CLI, because the IDE way is faster for that 95%.

Most things in life are about balance, and that's true here, too.

> I prefer tools that understand the structure of my project instead of just treating it like text

... but in the example you gave, did you not just have it pull up the text contents of a file in a window, and search through it (visually) as text? And on the command line, did you not invoke `jq` specifically to parse the JSON file as JSON?

And really, there is no reason that a TUI pager can't have progressive search that highlights matches. For that matter, vim actually does it. On the other hand, if you're just trying to jump forward to a named unique section, then the appropriate comparison is

> less packages.json <enter> -> /scr

Sure, `less` is more keystrokes than ctrl-p. But you're doing it in a much more general environment (it has to select from every program on your path), so of course it is.

> — Well, in my FrobnicatorStudio, there's a shortcut Ctrl+Alt+So for that

When I get those people typically I'll switch to Emacs (it's always open), use dired and rename 20 files at once, using either a keyboard macro I make on the spot or using a regexp replace.

This usually not only get them to shut up for good, they also typically then see me as the "computer wizard".

I demo'ed some terminal (piping command calls) and Emacs tricks to a very good dev who's using JetBrains tools. He got it and was very respectful... He told me: "yeah I can see the appeal, but it's not for me".

The CLI / terminal / command line utils won: LLMs have proved that. The discussion is over.

That and Python. LLMs will use one-off Py scripts for anything on the complicated side.
When appropriate I use M-S-! or M-S-| to run a shell command in emacs.
I don't think I've ever had to rename 20 files at once, so I wonder if the way people work is kind of shaped by their tools?
The only case I can imagine is when I rename a Java interface and want all implementations to be also renamed accordingly. I can do that in 1 second in IntelliJ. With dired on emacs that would not be possible at all and I would need a tool that can find all implementations first: that requires a LSP on emacs, and then from a xref buffer, not sure how I could rename all classes and their files at once. Probably would need to be manually done? Anyone knows how to do it in emacs with one command?
It would be the same as in IntelliJ. As long as you have the Java LSP active, you issue the `lsp-rename` action: https://emacs-lsp.github.io/lsp-java/#lsp-mode-commands

This works exactly the same for all languages whose LSP support this action, which is most of them.

No! Rename in JSP is not intelligent enough to match an interface name with its implementation names and decide whether to also rename those!
What do you mean by "implementation names"? I assumed you meant changing the "implements X", which should be easy for an LSP.
Java implementations sometimes take part of the name from the interface they implement, for example, `FooRunner` probably implements `Runner`. My example was that I renamed `Runner` to whatever, `Executor`, and IntelliJ will ask me if I want to rename also implementations (in this case, it would show `FooRunner` -> `FooExecutor`).
I've had to batch-rename files many times over the years. That means:

1. I do it manually over however many minutes. Works if there aren't too many (especially if the pattern is too complex to trivially automate).

2. I make a Python script for it. No way I'm renaming a thousand files by hand.

3. I don't do it. Too much work. The problem lingers forever.

Or these days,

4. I make an AI datacenter eat another town's water supply.

I've never used Emacs. I tried vi(m) nonconsensually and had to google how to exit. A while later, I tried it intentionally and hkjl navigation didn't work because I use a custom keyboard layout, so I never touched it again. Sublime Text and its many cursors for the win!

I'd love a way that isn't miserable to do such a common basic task.

> I'd love a way that isn't miserable to do such a common basic task.

The problem is that you actually describe a family of tasks which is not basic. The "iterate over files, select the right ones and apply rules to rename them" part is common; the problem is that the rules vary broadly in kind and complexity, and you haven't figured out how you want to specify them (some ways will be limited in the complexity they can handle.

(Usually the selection of files is trivial; when not, we can fold that complexity into the change rules, and emit null changes in some cases.)

If your selection rule is simple enough for Bash globbing, and your per-file rename rule is simple enough for, say `tr` to handle, then that's trivial to wrap up as a Bash script (or function). In fact, you could write the Python script such that it just accepts a single input filename and outputs the changed version, and handle the rest externally.

> I've never used Emacs. I tried vi(m) nonconsensually and had to google how to exit. A while later, I tried it intentionally and hkjl navigation didn't work because I use a custom keyboard layout, so I never touched it again. Sublime Text and its many cursors for the win!

I'm not really clear on how text editors are supposed to be relevant to batch file renaming. If trying vi(m) the first time wasn't your idea, then there should have been someone else around responsible for guiding you through it. But the variations I've tried had arrow-key navigation configured by default (and `vimtutor` explicitly tells you that it should also work); you really don't have to learn hjkl, which exists largely for a combination of historical reasons with a lot of back-filled justifications. (I would have used ijkl, mimicking an arrow-key layout.) And everything can be remapped in the config files.

Try vidir from moreutils (or its improved version, https://github.com/bulletmark/edir ).

It opens the list of filenames in a given directory (or set of files passed on cmdline) in an editor of your choice, and then you use your editor to rename them; the changes get applied when your editor is closed.

"I don't think I've ever had" stance, about any problem is not a good argument. At some point you'd face them and the mental models shaped by the tools you choose, often force you to deal with them in a way that often creates small, subtle micro-annoyances. You won't even consciously notice them, yet they add up. You get constantly distracted, every time by small bits, your focus budget gets eroded without you even noticing it. You feel inexplicably tired at 3PM without any meaningful work getting done for the day.

In psychology there's a term called "emotional bank account model" - small chronic negatives silently drain the account, so by the time something "big" happens there's no reserve left, even though the big thing isn't the actual cause. That is I think why our field has notorious "burned out programmer" problem. We can't even explain the reasons - because the accumulation is diffuse and undramatic, people lack a narrative-worthy explanation, and the real cause is chronic negative-affect accumulation.

That is why it is important to seek ways for the "gratified productivity" where no matter how small your problem seem to be, you can find ways to automate it nicely, ideally reaching for solutions quickly. Tools do shape your mindset. Expertise changes what affordances you perceive. Experienced Emacs user when stumbled on a problem looks at a workflow and literally sees the seams where it can be pried open, the way a climber sees holds on a blank wall. Novices often don't even recognize the wall. It's not that Emacs "has this capability, but other tools don't", it's not about specific features, it's about the mindset. Experience awk hacker for the same "rename 20 files problem" may combine a complex looking single-liner and say: "who needs Emacs schmimax? ble...", the difference in the approach, but the result is not just the output but also the mental gratification - small problem fixed quickly. While a newbie would be doing it manually, and maybe even solving it faster, but there's no gratification. We are species of "tool builders" - we get excited from using tools, sharpening them each time. Menial tasks don't leave that sharpened mental edge, they "blunt" your mindset and accumulate frustration.

I have a similar relationship with wireshark. I understand the use of a live capture and display and the attraction of the click GUI.

But at some point I just figured I was wasting so much time in there. Switched tshark and jq or good old bash/awk/grep and gnuplot, back to the command-line, then python for batteries, still using the output of tshark... and then ended writing a pcap(and ng) parser with ethernet-ip-udp/tcp and a full java IDE and never went back. I went the same meandering path with every data capture and exploration tool I had to use repeatedly.

I feel I'm not the only one having this repeated sequence of tooling improvement, hopefully there is a well named scale to describe it.

Then your manager asks you to wrap it in a GUI so your coworkers can use it, and the cycle is complete.
But this only speaks about what some GUIs lack, it's not necessarily true that GUI apps can't be composable, it's just that seldom they are made as such. The true potential of a GUI app is much richer than what terminal currently offers (unless it starts to receive capabilities usually present only in GUIs, as we can see with some of them - but then it's a GUI with the severe terminal restrictions, a strange beast).
vim isn't really something you use in pipelines though, it's a standalone tool.
`command_a | vim - -c "file /dev/stdout" | command_b`

or, assuming vim is your $EDITOR, you can use vipe:

`command_a | vipe | command_b`

whoa, you can and absolutely should pipe things in and out of vim - it's natural. Emacs on this actually in disadvantage - it doesn't give you a built-in way for piping from and into buffers, but for that there is emacs piper script: https://github.com/agzam/mxp
Dunno, never had to do this. At most I might set PAGER=vim which means maybe something else is piping for me. If you're piping with vim then fine, but it's not a requirement to use it, unlike smaller utils that are begging to be piped.
> never had to do this

is not a defensible argument (regardless of what you use), see the relevant comment here¹

the bigger point is to get more precise and utilitarian control over text which I already discussed here in this thread², piping in and out of your editor buffers sometimes comes very handy.

___

¹ https://news.ycombinator.com/item?id=48876315

² https://news.ycombinator.com/item?id=48869558

Kinda is, maybe I found better ways to avoid or deal with those scenarios.
I've never managed to make the terminal work for me. But I've been using windows since I was like 5 and I'm really bad at remembering shortcuts besides a handful of ones I use every day.

> When you reach that point, you will be, on average, much more productive than an average GUI user

How sure are you about that? I often watch streams of people using emacs or vim, with totally custom setups and it seems like a wash to me. They look like wizards doing some stuff, and then other things seem slower than my own workflow.

Absolutely no one ever has been shown to be more productive because they don’t use GUIs. It’s kind of preposterous to think that could be true.
That's a weird thing to say. GUI slows down me A LOT when I sometimes have to switch to it from my terminal for whatever reason. Where did you get your "absolutely no one" data point?
You should read again what I said. Do you think that simply using GUIs makes anyone less productive? You can’t think of any cases where a GUI is definitely better for a task than a terminal? If you think that , consider why the vast majority of people are using GUIs for everything, and only a tiny minority is using terminals for everything. It’s ridiculous, yes, to imagine you would be more productive if no GUIs existed (you just misunderstood my point).
I reread your original comment. It would have been better if you had included those small details that, for some reason, you left out. In my opinion, you simply failed to get your point across.

Anyway, my point stands. "Absolutely no one" without any context makes no sense whatsoever. There are a number of tasks that are much, much more efficient to perform in the terminal than in a graphical interface. So no, I didn't misunderstand your point - you're just wrong.

> any cases where a GUI is definitely better

Sure I can. Not all of them are though. So be careful with exaggerations.

Most programmers come to appreciate a single fundamental truth about their field way too late into their careers. That the most basic foundational unit, the substrate they need to conquer is text. Everything stems from it. We have to deal with text our entire lives. It doesn't matter where that text appears - in web browsers, in Jira, in Slack, terminal, in PDFs, Word or LaTeX documents. Code is just structured text. The feeling of empowerment and liberation when you can deal with text on your own terms is a disproportionate multiplier.

Vendors are designed to own you and ownership can have different forms. Slack.app that doesn't let you easily extract code snippets from a thread - owns you. Jira that forces you to use their imbecilic, quirky wysiwyg owns you. Note taking app that keeps the data in their db and not your files - ain't your friend. The friction is the ownership. When extraction of text requires effort, the tool has leverage over you. It's a subtler form than data lock-in - behavioral lock-in. You adapt your workflow to what the tool makes easy, and gradually the tool's affordances shape what you even think to do. Information gets buried in threads, search is mediocre, export is hostile. The "solution" they offer is to stay there longer - search in Slack, link to Slack, screenshare in Slack, summarize with AI in Slack, don't ever leave Slack. The tool becomes the answer to the problems the tool creates. It doesn't become "invisible" like the article says, you just don't realize that you're "lost" yourself in it.

Most popular editors and IDEs don't give you direct leverage over plain text either, at least not without the effort from your side. Shortcuts, popups, UI elements in the IDE at best are local drivers - you can't easily grab a thing from the outside and feed it to your LLM context in the middle of a task, or insert within a comment in the code - you have to switch, copy, paste, deal with format inconsistencies, manual conversion, etc. Then we keep bargaining what method is the best, fastest and most convenient - using the mouse or keeping the fingers on the home row, modality or complex shortcuts. All for the sake of the problem that's artificially enforced on your workflows.

Terminal-heavy users eventually start appreciating the leverage Unix philosophy grants them over text, but that's still contained within locality, they still have to constantly jump around, while eventually figuring out ways for automating some aspects of it.

Anyway, this should be a little more of a deeper discussion than a forum comment. Point is - do not give in to the status quo. Liberate your text - deal with it on your terms. Get annoyed whenever you need to switch back and forth just for the sake of finding the piece you need and moving it around - it should be instantaneous and instinctual. Like boxers moving on a ring and casually throwing punches. Long time Vim and Emacs users "get it", even though often don't follow true - some things never become gratifying instincts. Sometimes, even the opposite forms - redundant muscle memories.

> Anyway, this should be a little more of a deeper discussion than a forum comment.

You should turn this into a post of its own, it's probably the most insightful thing I've taken away from this entire conversation.

I realized that I was typing the comment above in the middle of the night; finally, brain fatigue showed up, so I wrapped it up too soon. That was all the "poetry." Now let me give you some concrete example cases.

1. You're typing a message to your colleague, and you're doing it in Slack, Teams, etc. Why? Why not use your trusted editor where you probably already have smart completions, quick spellchecking, thesaurus, definition and etymology lookup, translation and dictionaries, LLM integration and more.

Years ago I realized that and stopped typing anything longer than three words in anything else but my editor. But that forced me to copy-n-paste a lot, so I automated the process. I'd press a key in the middle of typing - regardless of what the current app is, the script simulates pressing Cmd/Ctrl+a Cmd/Ctrl+c; opens the editor buffer; inserts the text; I'll do editing; press a key - it goes back to the app; pastes the text. Stupidly simple, deviously efficient. Suddenly, my entire OS is my editor and my tool is "invisible" - like the article describes.

2. You're typing the message to your colleague. Now you're doing it in your editor, you want to share the url to the thing opened in your browser. What do you do? Normally, you'd switch to the browser, press another key to focus on the navbar, copy the link, switch back, paste the link. Goddammit, the url is cryptic. You, being a good teammate, want to add a description, now you have to go back to the browser to copy it. Then you have to make it into a markdown link format. Darn it. Was it parens and square brackets, or the other way around? We don't even realize how often we do this, because this simple action has become a routine. What's the point of arguing if mouse or vim or shortcuts is faster if the action is fundamentally flawed? For me, inserting a link from any tab in my browser is within a keystroke. It intelligently and properly formats it while retrieving the document.title.

3. Your colleague sends you a message: "Hey Jon, what about FOOBAR-41234?..." You know it's a Jira ticket number. But between FOOBAR-41345 and -41234 and a bunch of other recent ones you have no mental recollection of what that number is about. You go to your browser, navigate to the Jira instance, darn thing says you have to re-login, now you're going through 2FA - it won't even let you-in unless you find your phone and confirm it. All that effort just to look at the title. We all recognize this familiar flow, don't we?

Why even deal with this BS at all? Jira, Asana, Trello, etc. - all have CLI tools, you should leverage that. In my editor, whenever the cursor stumbles on a pattern like above, it immediately fetches the ticket description and shows it in a popup. I can quickly convert the plain "FOOBAR-41234" into a markdown, org-mode, whatever link format that has a description.

4. You're looking at FOOBAR-41234, you even see the description (because your editor is smart now), but how do you answer questions like: "what are the PRs related to this ticket?", "find slack threads that mention it", etc.? That stuff should be quick and easy. Do get annoyed whenever it takes longer than two seconds to answer any of these or similar questions.

5. You are pair-programming over Zoom. Alice (your colleague) is sharing the screen, you are reviewing some big unit of work. She's scrolling through the code changes, occasionally opening documentation, navigating to different sites, etc. You just can't bear constantly interrupting her with "slow down, I'm taking notes", "please, share this link", etc. After the session you frantically try to recall, but most of it is gone now, your notes are whacky, containing a bunch of broken urls and half-typed nonsense. Three weeks later it's a complete and utter garbage. Then you spend years debating of note-taking strategies of what "works".

That sho...

This is truly a high-quality post. I completely agree with it.

Workflow is tied to one's identity.

Regarding the discussion about Linux desktops in this post, I think the reason Linux lacks popularity as an desk operating system is that programmers want their computers to be not a 'product' but their own personal tool. So rather than preferring a unified system, they tend to want more freedom to modify the OS themselves.

In other words, this is about system customizability, and about 14 years ago, Linus Torvalds made a similar point [1].

Personally, I think the TUI vs GUI debate simply depends on the domain you belong to. Those focused on OS or open source work face pressure to become familiar with TUI, while programmers like me who deliver software to factories face pressure toward GUI. The people I deliver to almost always ask for the same thing: 'Make it understandable without reading the manual.'

On the other hand, most of the TUI and low-level work I've encountered has been dominated by the 'Read The Fucking Manual' culture.

I think people see the pros and cons of their environment depending on where they place their identity. I'm a programmer, but honestly, I don't really enjoy looking at a terminal. I look at the logical structure of my code and the logs when it runs, but I'm not really comfortable with the terminal. But the typical end users I deliver to are even less comfortable with terminals than I am. So I don't particularly like terminal culture or memorizing long command strings. They're just more used to clicking buttons. The problem is that the products we develop don't just stay with developers—they also need to be accessible to ordinary consumers. Of course, those who build tools for developers might not think that way, but I believe that even ordinary consumers should be able to easily operate the software

Others, of course, think differently. In the end, as the author of this post said, it's a matter of identity.

[1] https://www.youtube.com/watch?v=ZPUk1yNVeEI

Having designed a good number of internal tools for teams of developers I couldn't agree more.

Earlier I had the tendency to "leave the guts" open, thinking my users were developers and would want that. All it did was put obstacles in my teammates actually doing their work. My teammates must use the tools I made for them to achieve work the company needs them to do, they don't want, nor should they want to, fiddle with a little tool they won't find anywhere else.

I still leave a lot of escape hatches, but I try to design the internal tools in such way as to make the users fall into a pit of success.

> make the users fall into a pit of success

I don't have anything else to add but I thought this was a wonderfully evocative phrase.

it really depends on the framing, some work, especially fun work that develops skills is more valuable than people realize.

From an org perspective the goal is to create the highest curve of performance over the lifetime engagement of the employee or from the employee perspective their career.

And a lot of that depends on teh relationship of the people involved. From my perspective its a net negative when if my movers worked out the day before, their muscles will be sore and they'll do a worse or slower job. From the moving companies perspective its good, they'll be stronger for more jobs. Unless they quit or are fired that day, in which case we're back to bad.

The real evaluation isn't the macro vs the sublime edit. its does the thought process of making them macro improve them in other things, and what were they doing before that. In my experience no one is going use the time they spent writing a macro or a learning vim to do real meaningful work, they're doing that because they're bored or burned out and want to think about something else they find fun at the time.

your problem isn't your employees choose to write random scripts, its that they dont have a sense of urgency or care about their current task.

Some work is also less valuable than people - especially hackers - realise.

Hackers have an addiction to tractable problems that require effort and some skill, but have a well-defined solution.

They don't require true originality or cleverness. Barrelling through them with adequate but not outstanding skills is more than enough.

Hacker systems like Linux, Vim, and Emacs, offer exactly this. You can tinker with them to solve consecutive microproblems in a satisfying way. Likewise other standard projects like working with vintage hardware or repurposing a consumer product to do something interesting.

This kind of work generates dopamine, where spending four days trying to track down an incredibly subtle bug in a giant stack owned by a few tens of people generates frustration.

So it's not that employees don't care, it's because some work really is hard and frustrating, and solving tractable problems is far easier and more satisfying.

But is it productive? Even educationally? Not necessarily.

Some time ago I made an abstraction "hey, most people in our company who use CloudFront don't care about all the implementation details, they just want some paths to be somewhat cached". I explained this idea to a coworker. It took a while, but he understood it. Two months later someone merged a PR that replaced my interface "I want this and this path cached" with a simple passthrough that exposes raw AWS interface. Same thing happened to S3 buckets where I noticed that most people just want "auto-delete files after X days either on or off".

I spent entire year trying to explain to my manager "most devs who create services want a simple deploy button". Instead, we tried to teach devs how our "infrastructure as a code" works so that they'd contribute. The effect was that only one guy engaged with us this way, and he always sent us AI-generated PRs, and every time he saw an error, he just copy-pasted it to ChatGPT without reading and then the answer back to me.

The project eventually shifted towards my original idea, but in an extremely painful way without any design at all. It's just a toolbox of completely random features glued together because one day manager says "no we don't need to support X" and two months later a Jira ticket "add support of X".

I think configurability depends on how important your tool is to the core job function or role being performed, where it becomes very valuable for helping them directly perform the tasks they and their employer value, vs how much it allows you make problems they don’t value as much get out of the way of the ones they do.

For example, I am a HUGE fan of the way Gusto handles payroll and all the different taxes and form filing for me, because I basically do not even have to think about the problem or fiddle with it at all. But to someone whose job is doing payroll/accounting/taxes or working within giant enterprise HR/legal/finance departments that does more harm than good, because it’s something they have to fight (or less charitably it makes their job too simple).

The other big problem is who is actually making the decision to pay or spend money on a thing, and whether it serves more of a defensive (eg auditability, security, constraints against undesirable behavior) or creative purpose. The creative stuff is sexier but hard to quantify, and end-users won’t actually be willing to pay that much for it relative to how much it helps them or how critical it is to their role.

Getting out of the way is important because people use dozen of tools each day for n and out.

Unfortunately there is still a thing to balance against, which is forcing people to do the right thing.

There always will be bunch of people who nag about being impeded by doing something correctly, because they feel it is waste of time.

I think I have the same perspective. I see it as a flavor of progressive disclosure. Sane defaults and a way to customize if needed. Start with the 80% case and let people customize if they want to. It needs to be optional.

Especially with developer tools I think there's a hesitancy to be opinionated. If you don't know for sure an option is "always correct" it seems safer to ask the user. Developers can be very pedantic. "95% of people probably want it this way, but I should make people pick because that 5% has a valid point". But now you've made it worse for most users.

It's also so much more complicated to support customization, more than I think people realize. It's not just about bugs, every option makes polishing your UX much more difficult. Both because of the testing surface and also because more flexible abstractions are harder to design.

> try to design the internal tools in such way as to make the users fall into a pit of success.

Yes. I couldn't agree more. The tools have to make it quick and easy for the users to succeed - as invisible as possible, and transparent to what a user wants to achieve.

vi and emacs were designed by legendary computer scientists at two poles of the keystroke latency gradient. Bill Joy was on a model from an apartment in Berkeley, RMS was codifying the collected wisdom of a whole pool of elite typists on TECO and was doing so on the kind of connections at the MIT AI lab. Both of them were more or less stuck with QWERTY.

A keyboard interaction paradigm isn't a given chip or a driver for one. It is closer to UTF-8 than to Win 32. CUA is the Salesforce of such.

Ginger Bill, like many, is asserting that just because he's never encountered a bottleneck, there isn't one.

I'm not sure if that's arrogance or self-doubt puffing it's chest, but it ain't big dick energy.

RMS may be legendary but he's no John Carmack or whomever else. I use emacs every day, and nobody who does the same can honestly say the foundations are good. The performance is atrocious. The UI locks up when you make network calls because the whole thing is single threaded. The whole thing is a mess of spaghetti code and there are multiple instances of core developers like Eli Zarerski admitting on emacs-devel that they don't know how <internal core system> works.

RMS is a visionary but as an actual software developer he's pretty mid.

Emacs is just old. Its foundations (as in the general design) are truly fantastic. I still don't understand how the heck not a single other editor over so many years has even considered replicating ideas like indirect buffers. That alone is a truly brilliant idea, and there are so many more.

Performance is atrocious today. At some point, a couple of decades ago, it might have been considered superb, but some may still remember "8 megabytes and constantly swapping". Emacs can be slow, yet its keyboard latency is still better compared to some other, more modern tools.

I'm not disagreeing with you, Emacs can be so damn annoying, and yet paradoxically remain enormously useful. Sadly (or otherwise), there's still no meaningful alternative to it, nothing even comes close. Lem has a promising story, but I remain skeptical. I think Emacs gets core C improvements sooner than Lem reaches meaningful, practical parity, although I might be wildly wrong in my prediction simply because I don't understand the scale of entanglement of the C-written core of Emacs, yet surely it's probably easier than porting the gigantic body of Elisp in existence to work in Lem.

I can't really comment on RMS' software developer skills - I have never directly reviewed his code. Perhaps, in modern times he'd be considered a "no hire", because being a software developer today requires a little bit more than just being a brilliant code writer.

You’re judging RMS skills based on the current performance of a tool he created 40 years ago using the tools available at the time. That’s wild. You complain about emacs being single threaded but computers in the 80s had a single core. Software at that time was always single threaded. By the time multiple cores became available, emacs wasn’t RMS’s personal project anymore and with lots of users it couldn’t just replace the core to make it multithreaded.

Tell me what Carmack has written that’s still widely used but did not start with the same “problems” as emacs.

sorry for the stupid quesiton, but why do you use Emacs daily if you consider the performance atrocious and the foundations unsound?

Do you have to use it for work? Do you just consider other editors to be even worse, so Emacs is the best of a bad bunch?

> Do you have to use it for work? Do you just consider other editors to be even worse, so Emacs is the best of a bad bunch?

Not who you’re asking but:

- I have a very long legacy of both muscle memory and “just right” coziness in my Emacs environment, that has followed me around from machine to machine since about 2003.

- I have flip-flopped between GUI Emacs and terminal Emacs probably a dozen times, with my most recent flop being due to Codex and Claude Code, which I run side-by-side with Emacs in a split pane tmux window.

- Yes, best of a bad bunch. I am also reasonably comfortable in Vi(m) but dislike how it handles having many open files, which is unfortunately necessary for most of the work I do.

- I have used VSCode off and on over the years as well, most recently with Gemini, but found the GUI experience quite frustrating and the lack of a CLI option ended up being a show stopper (I sometimes need to write code over SSH and the way VSCode handles remote editing is highly unpalatable to me)

Emacs is not an editor. It's a Lisp-driven text orchestrator with a built-in editor. You can type your text in whatever IDE and still control everything through Emacs.
And before any major change, add a `--v2` for early adopters and `--v1` as default. Nobody should notice anything on `--v1`, any regression must be fixed imediately. Flip `--v2` as default, leaving `--v1` for the unforseen. Until you can finally get rid of them.

This helps being as invisible as possible.

Excellent idea; it's good practice to do that with APIs, so why not with command-line tools as well?
(comment deleted)
Reminds me of this quote:

"We notice the person who is for ever bowing and fussily servile, and perhaps say, How humble he is! But the truly humble person escapes notice: the world does not know him."

~ Tito Colliander

> usually because they don’t realize how much more productive keyboard navigation is than reaching for the mouse a lot of the time.

In a large number of cases people who say they are more productive have never measured it. They have no idea if it is true. There are been many competitions between keyboard and mouse navigation over the years. Depending on the details of how the test is written one will win or the other, often by a significant amount, in many cases the loser is the one that user said was more productive before seeing the real results.

I think if you need to measure this kind of thing, you're missing the point in the first place. I don't want to be chasing some absolute productivity metric, I want a setup that doesn't break my flow. For many people, reaching for the mouse breaks their flow and feels wrong, which is oftentimes worse than being a second slower, because it takes you out of the mental frame you were in.

For me, using my mouse while I'm working feels natural, so trying to change my workflow to learn how to navigate everything by keyboard would be a huge amount of extra effort just to maybe possibly save a little bit of time in some situations.

I think this is unhealthy self-handicapping. Your "flow" is just habits, things you've taught yourself to do. You weren't born with the ability to use either a keyboard or a mouse, there is no "natural" or "intuitive" way to operate a computer. It's all 100% learned behaviors that can be altered.
>Your "flow" is just habits, things you've taught yourself to do

By this logic a person who were comfortable with mouse should never grow to like VIM.

> there is no "natural" or "intuitive" way to operate a computer.

Fundamentally a computer is something that execute instructions. It is pretty poor interface to pick instructions from 100 options using a mouse as opposed to type it using a keyboard. A mouse hides the power of the computer behind a set of fixed clickable options. That is a pretty poor interface.

> By this logic a person who were comfortable with mouse should never grow to like VIM.

Quite the opposite, my argument is that habits are changeable.

> Fundamentally a computer is something that execute instructions. It is pretty poor interface to pick instructions from 100 options using a mouse as opposed to type it using a keyboard. A mouse hides the power of the computer behind a set of fixed clickable options. That is a pretty poor interface.

You continue to argue for my point. OP was claiming that measured efficiency does not matter because it's about "flow". I argue that one can teach oneself to flow differently, the commands can be learned.

Picking from 100 options is what the mouse is best for. Keyboards require learning so they are best for the options you do often enough to learn. I know about 10 different vi commands of the hundreds.

There is more than selecting options. Selecting text is normally better with a mouse.

>Keyboards require learning

We are not talking about keyboard shortcuts (key combinations that you press to do something) by the way, and about the actual typing of commands in the terminal/shell/repl what ever...

(comment deleted)
> there is "natural" or "intuitive"

Your argument is sound but this overstates your case a bit. There's a reason we don't type with our toes.

Most knowledge about human computer interfaces was obtained through metrics. Groupings, menu bars, corner buttons, context menu orderings, and other things didn't just spawn into existence. There was a time where human pattern recognition and physiology was an active consideration for user interfaces. One of the reasons mouse input became popular is precisely because interfaces were created to be easy to use with it.

All of this brings me to my questions: Why do you reject measuring how good an interface is? Or given your dismay over keyboard based workflows, why do you think they would win most of the time?

I'd wager that if actually tested, in only a few scenarios the keyboard would win, while hybrids (with both mouse and keyboard input) perform best for most people.

> "I'd wager that if actually tested,"

https://danluu.com/keyboard-v-mouse/ - """The widely cited studies on mouse vs. keyboard efficiency are completely bogus ... <testing, reading, etc.> When I look at various tasks myself, the results are mixed, and they’re mixed in the way that most programmers I polled predicted. This result is so boring that it would barely be worth mentioning if not for the large groups of people who believe that either the keyboard is always faster than the mouse or vice versa."""

Sigh, I don't know why a blog-post against micro benchmarks should alter my opinion on this topic. There are more metrics than just "speed" regarding an interface. You also want it to be discoverable and visually distinct.

How someone interacts with your software is absolutely measurable and the results will vary by how a user is likely to use it in frequency and variety of function. Someone that needs to do something specific with your software every day will interact with it quite differently than someone that just hops onto it every now and then to do a different task each time.

All of this requires actual studies and observation of users over time. Micro benchmarks have no space there. Testing how fast a find and replace is is meaningless. In case of software for writing text you'd test a user actually writing prose, changing font sizes, title colors, and maybe replace a word over the file too. You would have commonly used functions mixed in with less commonly used functions over how the software is used under a specific use case. (For example, writing text and revising text, and polishing a graph representation are different use cases)

This is not easy, which probably why it's not done all too often, but it is also most definitely unlike a micro benchmark (which your link argues against).

All that being said, I don't know of any person strictly pitting mouse against keyboard when testing UI for possible improvements.

Reaching for the mouse doesn't break my flow. It makes the thing I was doing invisible in the flow. Keyboard shortcuts require me to think, which makes it FEEL like I'm doing something, and that something is in the flow so it feels like I'm productive. However the mouse doesn't even enter into the flow at all, I just do the thing and get on with the real work without breaking flow.

Again, there is no universal correct answer. Sometimes the keyboard really is better. However sometimes the mouse really is better and because I'm proficient in it I don't break my flow to use it.

I wish the author had spent less time arguing why sublime is better or good at X Y and Z (and thus fall into the same tarpit as everybody else) and more that the importance-factor is entirely contingent on what the actual motivating factor, stakes, incentives, and outcomes really are.

Part of the problem is that online to even in groups larger than maybe 10 people, that’s too much context to productively keep in mind. So tools become ends unto themselves / common ground for socialization but lack the grounding that actually gives them value.

Because I agree with your last point - why should anybody give a shit about text editors at all? I don’t care about them at all, because how I navigate and edit documents doesn’t have any material impact on the actual work that I’m trying to do. Personally, I believe that it almost never is an actual bottleneck for people’s work, but is such a ubiquitous, configurable, and context-free tool that it approaches a Platonic deal subject for bikeshedding and flamewars.

What intrigues me is that that has a way of looping back around into popular culture and real economic/business decisions. You literally see it play out in real time with tech trends like mobile apps, Kubernetes, agentic tools, frontend frameworks, etc where they hit some critical combination of adoption and customizability, or conversely mature from a tinkerer/contrarian-oriented tool into one popular enough to be used for applications that require stability.

Is red better than lime green? Does red paint make cars go faster, or safer? Doesn’t matter what you think, if you sell fast cars, better have it in red

I have an anecdote to contribute.

I been doing a lot of Bender. Keyboard on left hand and Mouse on right. The keyboard shortcuts in Blender are excellent, but there are _many_.

I know this sounds silly, but what really breaks my flow is moving my mouse from the middle of the screen where my model is, to the top of the screen where the menus is.

I bought a Stream Deck which is a programmable keyboard with 32 buttons and a screen behind them. I've programmed my most common commands there, so I can just reach across with a finger and smash a button rather than move the mouse away from the center of the screen.

It saves about 1 second, but really makes a huge difference.

I use blender a lot too. I bind space to search and then use that instead of shortcuts for pretty much everything that isn't the few shortcuts I've memorised (and g/s/r xyz etc)
I think that's a pretty reductive stance to take. Keyboard nagivation is more productive _if_ the primary use of the tool is text-based. In a word processor, an IDE, a file manager, or anything else where the primary mode of interaction is reading, typing, and processing the things you've read and typed, keyboard navigation can be demonstrated to be faster and more natural _only if_ the user has taken the time to learn the shortcuts.

For tools that are mainly for non-text visual information, then the keyboard versus mouse debate is much more heavily weighted in favor of the mouse. Even then, there are times when effective keyboard shortcuts are far more useful than menus and icons. Take any CAD or 3d modeling software as an example. 90% of what a user does will be interacting with visually-presented spatial data, but even then knowing the shortcuts for changing tools or modifying a tool's settings will make you much faster and remove the need to constantly navigate nested menus of options.

Drawing/Painting and Cad modeling is very much like games. One hand on the keyboard and the other on the mouse. This mixture can be also done well in other programs. I only bother learning shortcuts for daily tools, not something I use every blue moon.

What I take issue is with tools that make them hard to use with low contrast between widgets or shortcuts that does not work if a text input is focused. Also tools that forget they have a primary usage and wants me to know everything at once (notifications, big action buttons, guided tours and what not).

> have never measured it

That's because it's practically impossible to collect objective data here, i.e. without confounding factors.

A product where the user spends 99+% of their time reading/consuming is almost certainly easier to use with a GUI. The market settled on thumb-flicking for doom scrolling instead of a button or scroll wheel interface, for a reason.

A product where the user spends 99+% of their time writing is almost certainly easier to use with a keyboard. Most sane people do not write essays on their phones with two thumbs; a keyboard and a proper word processor are preferred.

Most products fall somewhere in the middle. Most products have multiple interfaces, some primarily for consuming information and some primarily for producing it, and thus would find different inputs more productive in different modes. When people claim that they find one input type is more productive than the other, most likely is that their particular use-patterns fall more in-line with the one most aligned with their use-patterns.

I am afraid the author confuses familiarity with proof that his tools are better. The reality is that every tool has a trade off, and if a user prefers tool X compared to tool Y, it’s not because they are dumb, but likely they make better use of the affordances of that tool that only a power user would get.

Give a developer 10 years each with vim, emacs and Sublime Text, they wouldn’t be so sure which is better. [1] They might have a personal favourite, sure, but would also be able to tell why other people prefer other tools.

I am afraid this is one of those arguments borne of ignorance whereby one is has never given a proper chance to software they are unfamiliar with.

1: to me the mark of a greybeard that has been around a while is a vague dislike of every software and any promise of improving such software. In the long run, every piece of software tends towards mediocrity.

> I am afraid the author confuses familiarity with proof that his tools are better.

Literally NOT what I was implying or even said anywhere. Quote me where I said anything like that.

To quote myself:

> What baffles me is that so many people treat that friction—the effort of working around a tool’s limitations—as the “fun” part, and then advertise it as evidence that the tool is great.

This has nothing to do with why I or another person one tool over another, but rather treating the flaws as if they are things to have a puzzle game to work around.

People don't use vim because they enjoy puzzle solving. I don't even know how you got this conception. People use vim because they are effective at editing with vim, period, just like you are effective with Sublime Text.

People don't use Linux because they enjoy tweaking config files and everybody else has too busy a life to do that. That's a silly misconception and veiled attempt at feeling superior at those time-wasters.

> rather treating the flaws as if they are things to have a puzzle game to work around

Case in point.

Good tools are indeed invisible, but the arguments the article is built on are very shaky and honestly just sound from someone that didn't spend much time with other tools.

I do know quite a few people who use vim because they do enjoy the puzzle. So there are absolutely people as he describes. Saying that there aren't people like that just undermines your point.
Geez, I’m not saying there are none. I’m saying it’s silly to characterise it as an editor for puzzle lovers. You knowing ‘quite a few people’ can’t be generalised to the millions that use vim daily.
The article discuses that specific subset of users who are into puzzle solving, so we should ground this discussion around that point and not fall into the “tool x is good/bad” pointless debate.
It wholly does not. It in no way qualifies the statement that people who use tools with "more friction" (the unsound assumption under attack) because they view it as a puzzle game as a subset of the total users of that tool, and devotes zero time to discussing any alternative interpretetations of why someone would do so.
> People don't use vim because they enjoy puzzle solving.

I didn't say that either nor even imply it, and you know that when you quote me afterwards. So huh?!?!

> People don't use Linux because they enjoy tweaking config files and everybody else has too busy a life to do that.

A lot of people, including younger myself, got into Linux and Android BECAUSE it was configurable and customizable. And even played around with all of the customizations because it was fun to do. But it didn't really make my general experience better because I was forever trying to correct something I should have to correct in the first place.

I am not sure how much clearer I can be in the article or in my replies to comments.

No doubt it's frustrating to carefully head off a strawman misreading of your points, and then have someone like sph completely ignore that and attack the strawmen anyway ... but it's well known that people like that exist, else it wouldn't be necessary to head off their strawman attacks in the first place, so don't take it too hard when you actually encounter them.
You can be less of a coward and reply to my comment, since you are talking about me personally, rather than mentioning me by name elsewhere.

gingerBill and I were disagreeing, sure, but at least we were arguing on topic. I fail to see what is insightful about your comment than just pointing and saying 'get a load of this guy.'

Thanks for your input, you can take a seat now.

I wasn't talking to you.

Flagged.

Casting aspersions at others behind their back, and then claiming "I wasn't talking to you" when called out for it, is not a productive or civil mode of discourse. Please don't.
> I didn't say that either nor even imply it, and you know that when you quote me afterwards.

You come across that way when you describe your interactions with Vim users talking about how they use macros. (Which, incidentally, doesn't match my experience at all.) More importantly, your comparison of "Vim users do this with macros" to "I could do this with (proper) multiple cursors" doesn't seem apt.

Perhaps it could possibly make sense if we had at least one concrete example of "this"; but the most obvious thing to do with multiple cursors is patterned editing of multiple matching text fragments, and Vim users would (or I would, at least) normally do that with a /g regex. To the extent that macro is useful, it's because multiple changes are done (such that the dot command wouldn't help), and if that's too complex to do easily with regex then I can't imagine that the simultaneous changes with multiple cursors could actually get it right anyway.

More importantly, though: the real point of a macro is that, having recorded it, you can persist it even across editing sessions. You also mentioned the possibility of writing a script; a macro is that, just in a very small, focused language.

> A lot of people, including younger myself, got into Linux and Android BECAUSE it was configurable and customizable. And even played around with all of the customizations because it was fun to do. But it didn't really make my general experience better because I was forever trying to correct something I should have to correct in the first place.

This doesn't match my experience at all. I play around with customizations because I understand that the default couldn't possibly have anticipated what I wanted. But more importantly: I use multiple user accounts on my system (all for myself; I did this on Windows too) and what I appreciate about Linux is that I can duplicate configuration files instead of having to navigate through UIs again and click a ton of options (perhaps following notes on what to click; I never descended to the AutoHotKey level of madness, though).

(comment deleted)
The article does say this...

  If people find vim, emacs, or whatever genuinely good and productive, I’m not going to criticize them for using it. People are most comfortable with what they know. But for the people I am discussing, that same familiarity blinds them to their tools’ flaws, and leads them to celebrate those flaws, flaunting them as games.
I do use vim out of familiarity and also requirements. Not sure how many people really use vim just to be h4x0r, have at least met one but tbh not seeing this.

But sorry, I find the Linux desktop thing to be accurate even though it's a generalization. There's scarcely any usability advantage over there unless someone has specific requirements. The dominating mindset there isn't to make stuff just work, and it shows.

I rarely use vi{,m} these days but I sometimes still instinctively type motions or :commands into other terminal editors (which naturally blurts them out into the text buffer). When using something like Sublime or VSCode, I'm always hunting through menus, documentation and search engines to do something simple like ":%!sort -u". Kate is a bit unwieldy—far from invisible—but I've found it to be the most frictionless editor on the market by a wide margin.
If you're always reaching for vim commands, why did you stop using it?
Many small reasons; changing workflows, very strange default settings (may have been fixed a few years ago?), snaggy desktop integration, because it's a pain to use at work on Windows, etc.
Yeah, I'm so sick of hearing "it's way faster to install app on linux by using terminal than using that bloated gui softare center".
More often than not, good people too. And there are a lot of them. But a single unrepresentative person yelling in the room is all it takes to break stillness of quiet exchanges.
Interesting how all of grep, sed, ls, cp, mv, rm, cat, pwd, chmod etc are well over 50 years old and get used more than ever today. Claude code owes at least some of its success to the well established and solid unix toolchain
This is why LLMs are shit. They get between you and everything and turn it into a negotiation.
Funny: This title is a classic statement of Martin Heidegger’s. Go programmers!
I think this article might miss the point that tools like vim often have a much higher ceiling than the transparent or conventional alternative. You get good at the puzzle part of it (which goes along with any craft), and you are able to do things faster than your former self could have conceived.

I remember coming up as a programmer and seeing someone who was truly excellent at using their text editor making large sets of changes that would have taken me double or triple the time and having this feeling of, "ohhh that's the payout."

Keybooard and Mouse. Everytime. I have the same question.

How much do you type in a day that moving the hand to the mouse is a productivity loss? I spend a lot of time staring (thinking, planning) than typing. So, moving my hand to the mouse and back barely has any impact.

> I’ve had people tell me how “fun” it was to build a macro to handle some one-off text-refactoring problem. But when I looked at what they were doing and how long it took, my honest reaction was: I could have done that in Sublime in a minute with multiple cursors, or just written a quick script

I totally agree with the larger point, but there are things you can do with vim macros that are just an absolute PITA to do with the built-in tools in vscode. Or maybe there is a specific tool that can compete (or beat) a specific use case of a vim macro, but macros are a single tool that covers a zillion use cases. So for this specific example I think there’s a tangible difference in capabilities.

Also 99.9% of the time-saving macros that people write on a day to day basis are not being shared with a single other person. It’s just a tool that becomes invisible to people who are comfortable with it. I’d argue that modal editors are particularly good at getting out of your way! Particularly ones with little or no config, like helix (or even vim mode in an IDE)

I think of "invisibility" as a way of removing unnecessary friction and the author doesn't quite drive home that point effectively.

Good invisibility is like well designed roads. Smooth, clear markings, adequately wide or narrow for the desired speed, easy and obvious signs. Unbothersome and pleasant. Drivers simply drive, rather than get bothered by, "gotta avoid the pothole. Here's comes the bumpy part. That blindspot, I gotta slow down for way too much. Unseen pedestrians pop out here."

This is where invisibility in interstate highway regulations are obvious.

When I see TUI vs GUI comparisons, it distills to friction for a given context/workflow.

I worked in a restaurant with a micros system. It was a very easy to use GUI that was touch screen button driven. A 1 person order could easily be entered in 6-7 button pushes in 2-3 seconds to a seasoned operator: drink > coke > dish > steak > medium > a1 > submit

The beauty with micros was that it reduced the typical navigate > select > add > back-to-navigate workflow into 1-2 button presses with a receipt-like tally providing immediate state feedback.

In this scenario, telling a user to get into a terminal console and type "cd Foo; ./add ketchup" would violate the invisibility principle. It has nothing to do with TUI or GUI.

To me, good tools get out of the way, in the given context. Micros did that.

CLI users are in a CLI flow, thus introducing a mouse to a keyboard workflow violates the invisibility workflow. But for a GUI user to hit up the terminal violates their flow.

Ultimately, all workflows are in search of a faster/less-toilsome feedback loop to the desired goal and tools are in service to the loop. Well designed tools with rabid followings understand through usage where to add friction, and where to cut toil and I'd argue this is where CLIs shine with decades of refinement of the same tool chain.

GUIs are a, it depends on how composable or self contained the given problem for a GUI interface is.

But yes, tools should be invisible. How they become invisible depends.

In the age of agents, I’ve found the headline claim is even more true

I acquire and operate ecommerce companies, and build a lot of workflows with openclaw-like agents (my own stack).

When it’s working really well, there’s literally no interface needed besides iMessage and email. I’ve built a SaaS app interface style largely to show it off for demos because invisible tools don’t make for great demos