Moral lessons from free software and GNU Emacs
protesilaos.com
protesilaos.com
> Never mistake conformism or obedience with virtue
I would tweak it to say "Don't rely on conformism if you will gain more with autonomy." But that's the kicker; most users won't. Microsoft and Apple are trillion-dollar companies not because they've tricked people into using their ecosystems, but because those ecosystems solve most people's problems most of the time without a lot of thought.
The kind of person that slings emacs around for fun probably won't flourish lashed to Apple's mast. But most people care more about the destination than the journey for their computing, and for them, I'd recommend one of the two big OS vendors over trying to self-maintain a GNU/Linux desktop ecosystem 99 out of 100 times. What the author calls "fake comforts" they just call "comforts."
The author and myself, among others, believe that we should be free to use our computing machines as we see fit. That is, the value of autonomy far exceeds that of any benefits of heteronomy. We believe that we always gain more with autonomy. That this is a minority view is of no ethical importance.
However history, both in computation and in general, has shown us there is never a shortage of those willing to sacrifice their autonomy for the initially lower cognitive burden of letting someone else make decisions for them. The costs of doing so are often only apparent after some time.
On using a system from heteronomous vendors such as Apple, Google, or Microsoft long enough, it will inevitably be changed in capricious and annoying ways. Those who abandon the virtue of freedom are forced to rationalize why accepting this abuse is actually a good thing. Meanwhile those who hold to freedom as a virtue do not. They either switch to a system that respects their autonomy, or they grit their teeth and bear the abuse without any need for calling evil good.
For what it’s worth I agree one of the things autonomy grants is the ability to give it up. I’m willing to grudgingly use closed firmwares and graphics drivers for example, but I view it as an ethical compromise and not anything good.
Unfortunately, it's simply not true for everyone. I'd hazard it's not true for most... That the set of people who can really make a computer dance if the architecture is open is a tiny, tiny set. The net harm were that to be the only option (i.e. if Apples and Microsofts were removed from the equation) would be significant.
I have older family members that I must continuously run tech support for. Most of my time is spent pruning their choices to the set of only things they want the machine to do because a wider space leads to confusion and inability to complete tasks (when it isn't being used as an exploit vector by malicious actors taking advantage of the flexible nature of a general-computing architecture to phish them).
None of this is to say nobody's architecture should be open and mutable, and I fight hard against any attempts to make closed the only option on the table. But most users aren't power users any more than most drivers want to replace their own spark plugs.
Autonomy and heteronomy should, ideally, both be options on the table, and I see no value passing moral judgment on those who adopt either. For some, a self-run architecture is the freedom of the frontier; for others, it's the freedom to get eaten by wolves in the jungle.
I've also been family tech support and as often as not the problem is that some app or other stopped working properly or altogether after a system update. I often get complaints along the lines of "I used to do X this way and now I can't, can you put it back?" And I pretty much just have to say "no, I can't. You need to now do X in this new way," supposing it's still possible at all.
More generally, I believe that the West, and perhaps the world, has been sliding toward ever greater heteronomy for several generations now. Not so long ago most drivers did replace their own spark plugs. Not so long ago virtually all computer software did respect the user's autonomy. And it's not like we're talking about the dark ages, this is all comfortably within living memory. On a similar note, the right to repair tractors is another big autonomy issue for farmers, especially smaller ones that are operating on razor thin margins.
Another example is cooking. Also in living memory, virtually all food was cooked from scratch in the home. People had autonomy over what they put in their bodies. The submission to the heteronomy of a mostly processed food diet may well be responsible for a number of serious public health issues from endocrine disruption to obesity.
I agree that many would be uncomfortable with having more autonomy. Nevertheless, we as a culture should value freedom and autonomy and hold them up as values to aspire to. As you say, some will benefit from autonomy more than others, but I just don't believe anyone truly benefits from having their autonomy taken away.
By the way, I appreciate your spirit of pragmatism. I also try to be pragmatic. I recognize that in some matters heteronomy is socially beneficial. I simply believe we're striking a considerably suboptimal balance skewed ever further toward heteronomy. I think our social structures will become considerably less fragile if we work to encourage a culture of autonomy.
Thank you for this exchange. I think you've laid out your position clearly and distinctly and I appreciate it.
I think that actually sugar-coats a truly cruel approach. It's not "some benefit more than others," it's "some benefit while others suffer."
Pushing the autonomy slider to its limit is just breaking governance and letting the strong rule. Maximum freedom is nature red in tooth and claw. We build heteronomous structures to escape that chaos.
Of course, pushing the slider all the way towards heteronomy is also terrible. But given these two thought experiments, I fail to see how one passes moral judgement on someone who likes the slider tweaked a bit further towards either extreme than I do... "Moral judgment," to my mind, implies an absolute virtue that is absent from the equation. It's a struggle for balance, not for supremacy.
I just want to claim that this the reason why MS Edge and Google Chrome do not have native bookmark tagging. Any feature that makes bookmarks easier to search cuts into the bottom line of Bing/Google.
Nyxt has some auto tagging or summary features iirc.
A similar feature is lacking in file explorer GUIs, so it's likely a different reason.
My guess (from anecdotal experience) is most people don't use bookmarks, and those that do don't see value in organizing them. It takes too much discipline from the user to tag documents each time they are added. So the userbase for bookmark tagging is miniscule.
So ultimately, since so few users value the feature, no one bothers implementing it.
Not so fast there!
m-x doctor
http://www.art.net/studios/hackers/hopkins/Don/text/rms-vs-d...
>RMS -vs- Doctor, on the evils of Natalism
[...]
RMS> Perhaps the people who have decided to have no children should start making proud announcements, so as to set a better example.
Doctor> Is it because of your sex life that you are going through all this?
RMS> I could start.
Doctor> Is it because of hangups you have that you say you could start?
RMS> I'm sure everyone on this list will be glad to know I don't plan to reproduce myself.
Doctor> How do you reconcile your inhibitions?
[...]
For me, one of the biggest lessons is really teasing out the differences between what the computer can do and is good at, and what I can do. It's VERY easy to confuse the two. In fact, I think this is why I think most AI is completely overhyped.
Computers keep perfect records and can remind you of things. This is basically the only thing the computers can definitely outdo you, the human, on. They really can't think as good as you. I think a great example of this is the Mindmap/graph stuff prevalent in many note taking deals. I used to love these things (and they're fun) until I realized that my own brain is SO MUCH BETTER than this thing at this particular task. I make these connections far better than this thing ever can.
Can you give some intuition about “thinking”?
Is “thinking” what I do when playing chess? In my case probably not, but let’s say a grandmaster. Because if so, in that domain, whatever a computer is doing seems superior to “thinking”.
Machines are good at well defined tasks, but not good at determining what those tasks should be, or even how to do them, etc.
Yeah, I’d love to have car-like locomotive capability built in to my bio-machine. Or, maybe I wouldn’t, I dunno what all the consequences would be.
> Machines are good at well defined tasks, but not good at determining what those tasks should be, or even how to do them, etc.
But as a human, I mostly just copy-paste other humans. I’m not out here Solving Life from first principles.
As great as computers are, I think a big problem is how they've created this tendency for bad analogies when it comes to the details. Not really different from how Frankenstein came about from people watching the advent of mechanical stuff like gears and pistons and such, and then made the LEAP to "HUMAN LIKE MONSTER."
I'm not saying it will never ever happen -- but I'm still comfortable saying, even today, computers are NOTHING AT ALL LIKE human brains.
I suppose we just disagree about this. My own experiences indicate that mostly I ape other humans rather than “figure” things out.
> As great as computers are, I think a big problem is how they've created this tendency for bad analogies when it comes to the details. Not really different from how Frankenstein came about from people watching the advent of mechanical stuff like gears and pistons and such, and then made the LEAP to "HUMAN LIKE MONSTER."
But isn’t that happening in the real world? Machines intended to present as human are becoming more human-like overtime.
> I'm not saying it will never ever happen -- but I'm still comfortable saying, even today, computers are NOTHING AT ALL LIKE human brains.
I don’t think computers need to work like brains in order to do most of or all of the things that humans do. As you pointed out a car doesn’t need to work like a human’s locomotive system to do like human locomotion.
people who use vscode are just not the kind of people who would be interested in using emacs, and that's fine.
That said, Microsoft’s gotta Microsoft, and between their GitHub shenanigans and their proprietary language server, I’ve switched back to Emacs. BTW, turns out elpy has been coming along nicely and offers nearly as nice of an out-of-the-box experience as VS Code, and is better in some ways.
For example, modern editors have a neat feature where they'll highlight a variable everywhere if you put your cursor on it. Nice to have, didn't think to look for it, there's a vim plugin that does it.
This sounds like pressing '*' over a keyword in vim.
object.field
and a variable that just happened to be called field
but when double checking I wasn't able to get any clever behavior out of it.My Linux + Emacs will remain the same until the heat death of the Universe. The last change was when I had to write an early-init.el file for Emacs 27, the next one will be probably when X is no longer maintained.
I don't particularly hate change or learning, I just like my setup. It works for me. Don't take it away from me.
Also, the fact that when Emacs freezes, everything else freezes is a huge problem.
A solution would be to use another Emacs within EXWM? That seems unrealistic: keybindings conflicts I guess, and also, then why use EXWM?
Now I'm happy with Gnome (no conf file) + Emacs with 200 lines conf file (which is small). I love that it takes only 1s to restart Emacs when I play with its conf.
What I found out:
- i3's config system is pretty extensible, and I was able to port over the majority of the shortcuts I wanted without too much trouble.
- I thought it would be annoying to have configs in two places, but because my Emacs config changes very rarely, and because my i3 config is the same and also changes pretty irregularly, it turns out it's actually not that big of a problem to duplicate setups when I want to add something. Once a setup is stable, optimizing for keeping it in a particular form can sometimes be a lot of work for very little payoff, because you don't spend a lot of time updating it or debugging it in the first place.
- EXWM's keyboard interception (particularly with evil mode) turned out to be not quite as good/low-latency as I needed it to be? And that meant that a lot of the benefits of "one set of bindings/commands everywhere that just works" were a little overstated in practice during daily use.
- On that note, you bump into the problem that stuff like your "save document" shortcut might not actually be very universal, because it's not enough to have your window manager recognize that, you also have to have the program recognize it. And it ends up getting kind of cumbersome to figure out the mappings/scripts you need for each piece of software you have installed (or at least it was for me). Again with the optimization question above, most of the work to keep my keybindings consistent ends up being with applications, not with the window manager.
- Some just general bugginess around some stuff like floating windows that were probably at least partially the result of my config.
- The single-threaded nature of Emacs was a problem, even though people told me it wouldn't be. Freezing your window manager because you run a terminal command incorrectly feels bad.
It was still usable, I was able to get work done on the machine, it was fine and I liked it at the time, I wasn't unhappy. But I've noticed that I spend a lot less time doing maintenance/setup now that I'm using i3, I have far fewer freezes/crashes, and I'm finding that this setup is able to replicate most of the other stuff I care about. There are a few things I miss, but not enough to go back.
EXWM has a few issues like freezing, buffers vanishing into thin air, applications that use multiple windows or fullscreen not being displayed properly. It's developer also vanished around a year ago, it is barely maintained. It is not perfect, but it is powerful. Mucking around in text files, C and shell scripts to replicate my setup would be painful.
And what I found is that stuff like "toggling every Firefox window" or "listing all of my open windows and letting me fuzzy-search them" turns out to be about as power-level as I get in practice. So if losing the concept of buffers is the only thing holding you back, I still use "buffers" in i3, I use the same language to think about everything that I used with EXWM. Off the top of my head, some of the stuff I have set up:
- Multiple-key keybindings like I had in EXWM. For example, `alt-spc w d` (command window delete) hides a "buffer" instead of closing it, just like it does in my Emacs config. `alt-spc w /` splits a window right. Modes in general in i3 are abusable in some really interesting ways.
- Buffer fuzzy-search, toggles for application groups, re-grouping applications into different workspaces, etc...
- Window swapping, even between workspaces
- Window splitting/reorganizing using the same keybindings that I used in Emacs. This is a situation where i3 actually has an extremely slight edge because EXWM can't have multiple window views into the same application buffer, so you can't have two windows pointing to the same Firefox buffer. And this problem doesn't vanish outside of Emacs, but working with pure X11 gives you slightly more potential to do weird things around that.
I'm definitely not going to tell someone to switch, if you use EXWM and like it, great, stick with it, I see no problem with that at all. Just that I don't want to scare someone off of trying i3/Sway if they assume they can't script it.
----
The big difference I've found in how I build my config now is that i3 kind of takes the opposite approach to Emacs on interaction with other programs, where instead of having everything bundled inside one config file and pulling state out of those programs into Emacs, in i3 you call out of the config file into normal scripts and those scripts can control i3 with normal messaging or shell commands. So you can still build these really composable setups that are doing very complicated things, it just forces you to be a bit more Unix-y about it.
My personal experience (others may vary):
- The upside to that approach is that i3 is a bit less cumbersome to integrate with other programs, not because Emacs can't, but purely because the syntax is a little bit nicer and I don't need to worry about stuff like threading as much. Big upside in that I can have i3 triggers and commands that originate from other programs. In Emacs I can't really do anything unless Emacs started it or unless I set up a messaging system. It's kind of cool that any extension or script that's running in another program can also call into my i3-config for me if I decide to give it shell access.
- The big downside is stuff like state management, which becomes more annoying because you can't just have a list of pointers to windows that you care about stored in memory. You can do it (session variables, files, etc), but it's the reverse of the problem above, it's just more annoying than it would be in a Lisp repl where you could just make a list. I still haven't really gotten around to building an undo command just because I haven't gotten around to thinking about where I want to store the undo tree.
- And the other (slight) downside is not having nice display prompts built in by default. It's understated in Emacs how nice it is to have one generally agreed-on way to display a list of options on the screen, and Linux in general is missing that kind of universal one-off toolkit for building quick text interfaces/prompts for things. There are a lot of projects that try to fill in these gaps, I haven't found any that I love yet for quick scripting. But that could just be me.
Some of the stuff I miss from EXWM also comes from Emacs being kind of bad at playing with other programs. There's not a lot of good ways for me to add Emacs text buffers to my i3 search commands because Emacs doesn't have any good way I've ever been able find to run a command externally and then pipe the contents of the output buffer back. That means that any functionality I have in Emacs is just kind of locked in there. I can have a keyboard shortcut that opens up an Emacs frame to my TODO list and toggles that on/off, but it has to open up a frame. This has always been weird to me because I'm running Emacs in headless mode, it seems like I should be able to run commands and query text from a buffer without opening a frame.
But all that to say, if all you're talking about is toggling groups of windows or organizing views by project, then that's fine; you can do stuff like that no problem. i3 will give you access to its entire layout tree, so you can traverse it, you can get a list of buffers, and you can do things like edit it, save it to file, reload it. It's not perfect (stuff like merging trees is kind of annoying), but it's pretty usable for most stuff I've tried to do with it. It mostly just comes down to how complicated you want to get with remembering layout and managing state and stuff while you're toggling things.
----
My buffer swap script is:
#!/bin/bash
selected_id=$(~/.config/i3/scripts/helpers/buffer-list.sh)
i3-msg swap container with con_id "$selected_id"
i3-msg [con_id="$selected_id"] focus
Yes, I know the selected_id line is potentially vulnerable to malicious buffer names.To split a buffer right and prompt for a new program (same setup I had in EXWM) I have <alt-spc w /> mapped to:
#!/bin/bash
selected_id=$(~/.config/i3/scripts/helpers/buffer-list.sh)
i3-msg mark __current_focused_buffer
i3-msg split h
i3-msg [con_id="$selected_id"] move container to mark __current_focused_buffer
i3-msg unmark __current_focused_buffer
i3-msg [con_id="$selected_id"] focus
Querying buffers as a helper script: (note the hurdles getting a buffer list from Emacs, and calling into multiple languages to do other parsing just because my Bash-foo is pretty bad): #!/bin/bash
# Get emacs buffers
# echo "-eval (print-buffer-list)" | nc -U /run/user/$(id -u)/emacs/server 2>/dev/null
# TODO finish this and do something with it.
# Get i3 buffers -- I'm using node scripts for some parsing here because it's
# easier and because I can. Try to stop me.
i3_tree=$(i3-msg -t get_tree)
i3_buffers=$(echo $i3_tree | node ~/.config/i3/scripts/helpers/parse-i3-windows.js)
selected_buffer=$(echo "$i3_buffers" | dmenu -i -b -l 10 -fn 'pango:monospace 18' -p 'Choose a buffer:')
selected_id=$(echo $selected_buffer | awk '//{print $NF}')
echo $selected_id
This also can do things like filter out buffers based on titles or their position in the workspace, so basically all the same stuff you would expect from EXWM on that front.I mentioned in the previous comment, but the other thing I've discovered switching to i3 is that being able to get low-level with some of this stuff and control i3 directly from anywhere turns out to be pretty nice for this kind of setup even if it does mean I'm forced to be a bit more verbose in my code, because my config is pretty set-it-and-forget-it; I add new capabilities only when I need them and otherwise I basically leave it alone. So I'm not really optimizing for being able to re-type this by memory constantly; I rarely edit my config once I have it the way I want it, and then I just have these "operations" like splitting/swapping as helper scripts and if I ever need to use them as part of another command, I call into them.
Hoping my parent comment doesn't come across as "you need to switch" as much as "if you want to try something else or if you want to move to Wayland, don't let this hold you back."
I'm unsure that conclusion follows from those premises, since patches are not formally verified either.
Microsoft takes the idea of the latter, buries the distinction in the former idea, and shoves "feature" updates down your throat in the name of "security".
Looks like I must be doing something wrong then. Every single time I re-install Ubuntu (and switch to a newer Emacs version), yet another thing in my Emacs config breaks (mostly plugins). To me it's very far from a configure-once-run-forever piece of software.
VSCode has its own shenanigans, of constant updates, configurations, java/scala is a mess to set up, telemetry, proprietary extensions, etc. So deeper work is anyways going to need investments also there, but there's also lock-in to the eco-system and thus less freedom.
https://github.com/Comevius/dotfiles/blob/master/ABS/emacs/P...
https://github.com/Comevius/dotfiles/blob/master/.emacs.d/ea...
https://github.com/Comevius/dotfiles/blob/master/.emacs.d/in...
Only fuck with your init.el if you really want/need to.
I've had the same init.el for almost a decade.
These corporations don't really want us to own anything. There's always a "license", "terms" or whatever. They're just generously allowing us to use the computers we paid for.
Block msn.com at the DNS level. That removes almost all of these annoying bugware.
I have a bunch of these rules as part of my pihole blacklist, that works surprisingly well. Adding msn to it was really a visible change when using windows.
https://seclists.org/fulldisclosure/2006/Apr/509 [RE: Microsoft DNS resolver: deliberately sabotaged hosts-file lookup]
So the only answer is, as pointed out, a pihole or similar outside approach.
Have you tried the MathPlot shell backend, so you can get colored graphs in the Emacs interactive shell? I like that if I am doing any machine learning via SSH to a remote server.
People who prefer to use commercial software are indeed giving up some of their freedom in exchange for convenience. Almost all of us willingly give up some freedom by not growing our own food, or building our own car. This isn't a value judgement, just an observation.
Might be too late. We've long lost the freedom to simply plant the seed of an apple bought from a supermarket. Thanks to genetically modified, engineered fruits. What I mean is if we keep supporting heteronomy, the balance with autonomy will become so skewed that this option of switching to autonomy might not exist.
Today there aren't as many hardware options as they used to be, to run your own BIOS replacement like CoreBoot, or even Linux for that matter. One has to buy a Windows laptop and install Linux on it. I have to constantly turn off Secure Boot off for it to work. Windows 11 made UEFI (as opposed to BIOS) mandatory, so the laptops on market don't have BIOS anymore. This means that I don't have the option to buy a BIOS based laptop.
I don't think it is too late. YouTube for example has many videos showing people growing their own food (including apples) and instructions on how to do it.
> Today there aren't as many hardware options as they used to be
True. Hardware constantly changes and sometimes what was available 10 years ago no longer is. However you still have the freedom to buy a PC without any OS installed and install Linux instead of Windows.
The third lesson is that autonomy comes at a cost. It presupposes responsibility, and that is predicated on discipline. If you do not want to be responsible, if you prefer to be spoon-fed what life has to offer, then you remain in a state of heteronomy with its fake comforts. This is not about the Mac per se. It is about understanding your system.
Here I must stress that discipline is not the same as conformity with the established order. No! Discipline is a virtue. It is about overcoming your pernicious rationalisations; those that keep you trapped in a state of perceived helplessness. It is about deciding to be in charge of yourself and being prepared to deal with the challenges from a position of control. Discipline is about adding structure to a theretofore chaotic life.
Never mistake conformism or obedience with virtue.
If anyone is making this political, I think that's you.
https://dictionary.cambridge.org/us/dictionary/english/progr...
https://www.dictionary.com/browse/progressivism
https://www.merriam-webster.com/dictionary/progressivism
https://www.britannica.com/topic/progressivism
This follows the general trend, where -ism is usually used to describe a particular school of thought, while words ending in -ness are used to describe a more general tendency.
That said:
1. Dictionaries are descriptive, not prescriptive. I use and recognise "progressivism" and "conservatism" in non-political uses.
2. I fear if we're debating defintions, we've fallen victim to Layne's law.
2) I fear that if you make a habit of telling people that they have, by using the conventional definitions of words, misread things, you will naturally get into debates about definitions. I'm happy to not debate definitions and just use the standard ones.
I'm going to hazard a guess that he'd say the owner of the plane should at the very least be able to inspect the source code and compile it. I won't speculate as to whether he would say the owner of the plane should be free to modify the software in a way that made the plane less safe, but I would hope not.
I'd hazard a guess that he would say that the owner of the plane should in fact be "free" to modify the control software of the plane, but that the owner (airline) would then be required to re-certify the plane as well. And that might mean that the Free argument extends to the airworthiness test suite used by the manufacturer as well.