Bill Atkinson, RIP

Sadly, Bill Atkinson has died. Atkinson was an early Apple employee who, among other things, wrote MacPaint, QuickDraw, and the HyperCard system. Everyone who knew him considers him one of the best programmers of all time.

Here, in his own words, is Atkinson’s account of Steve Jobs luring him away from his PhD studies and his early days at Apple. When Jobs left Apple to found Next, we wanted Atkinson to come with him but Atkinson chose to stay at Apple and complete HyperCard.

Take a look at this tribute from John Gruber over at Daring Fireball. Gruber makes clear why he thinks Atkinson holds a privileged place in the Pantheon of great programmers. Steven Levy—of Hackers and Insanely Great fame—also has a nice remembrance of Atkinson over at Wired but you may encounter pay wall problems. If so, try Apple News if you have access to some sort of Apple device.

If you’re my age, it’s a sad reality that all your heroes are quietly passing away.

Posted in General | Tagged , | Leave a comment

macOS Keybindings On Cocoa Ports

In response to my post macOS Keybindings In Emacs, Paul R. Jorgensen notes that not every macOS Emacs port has the OS bindings defined. In particular, those ports based on the Mac’s Cocoa interface don’t support them.

Jorgensen has his own post on the matter that goes into a bit more detail. As far as I can tell, unless your using Mitsuharu Yamamoto’s Emacs port for the mac this isn’t a problem but if you’re not using a NextStep based port, you’re probably going to have a problem using macOS keybindings in Emacs.

Not to worry though. If you want those keybindings and your port doesn’t provide them, Jorgensen shows you how to get them. His setup assumes the ⌘ Cmd key is mapped to Super so that, for instance, ⌘ Cmd+s is mapped to Super+s. If you have ⌘ Cmd mapped to something else, it may not work as well. For example, if you map ⌘ Cmd to Meta the way many people do, then ⌘ Cmd+v is going to get you a scroll up rather than a paste.

As I said in my original post, I don’t think that there’s a lot a value in having these bindings added to Emacs—but see hmelman’s comment for an contrary viewpoint—so I wouldn’t bother changing my mappings if you’re a ⌘ Cmd == Meta user. Regardless, as Jorgensen says, “Emacs is a wonderfully flexible tool, is it not?”

Posted in General | Tagged | Leave a comment

🥩 Red Meat Friday: AI And The End Times

It’s hard to find anything on the Web that doesn’t somehow involve AI. We here at the Irreal bunker are a bit skeptical. We view LLM AI as little more than a magic trick not all that different from Eliza or Rob Pike’s Mark V. Staney.

If you look at what’s being said, it appears to be based either on cynicism and greed on the part of the new AI companies along with naivety on the part of those who believe the singularity is, at last, here or its complete dismissal as a fever dream. It’s hard to find any commentary in between although Watts Martin describes an intermediate position that acknowledges the problems but accepts that LLM AI is here to stay.

Regardless of whether you believe there’s anything substantial behind the current AI craze, there’s no doubt that it’s changing how we go about everyday activities that we’ve been doing the same way for centuries. A good example is school essays. It used to be the worst a teacher had to deal with was some second rate plagiarism. Now students are using AI to write whole essays complete with references (that may or may not exist).

Concerns like that raise the question of whether AI is destroying our ability to think and reason. Even the tech community isn’t immune. There are several articles lamenting the loss of reasoning and thinking abilities on the part of developers who have embraced AI for their coding. Of course, not everyone agrees.

Even accounting for the usual “kids today!” reaction from those of us in the, ahem, older cohort, I have to say that the idea resonates. Senior people are seeing an acceleration of the decline of abilities on the part of new developers. It does seem that the new AI is bringing us harmful effects along with its benefits.

On the other hand, Irreal has often and loudly ridiculed almost the same claims when they were made about, say, calculators or the end of cursive handwriting. People at the time predicted all sorts of dire consequences, none of which, of course, came to pass. Still, I think there could be a difference.

Calculators, for instance, basically replaced a mechanical process—paper and pencil arithmetical calculations—with a more efficient mechanical process. The current AI is being used not to replace something mechanical but thought itself. Paul Graham has a disturbing essay that predicts the current AI will shortly divide the population into the few who can write and the many who can’t. That really, really matters because, as Graham says, writing is thinking so the conclusion actually means that most people won’t be able to think very well.

It is, of course, possible that a future essayist will hold Irreal up to ridicule for screaming about falling skies. I hope that happens because the alternative is truly frightening.

Posted in General | Tagged | Leave a comment

macOS Keybindings In Emacs

I periodically publish reminders that

  1. macOS uses some common Emacs editing keystrokes by default, and that
  2. You can do much better by adding other Emacs keystrokes to those that macOS will recognize.

Here’s one such recent reminder. Now Bozhidar Batsov has turned the tables and revealed that Emacs also recognizes many macOS commands1. If you look in ns-win.el you’ll see a rather long list of macOS bindings that Emacs will recognize. You can, for example, save a file with ⌘ Cmd+s or start an incremental search with ⌘ Cmd+f. There’s a surprisingly large number of other such bindings. Take a look at Batsov’s post or ns-win.el for the details.

I didn’t know about any of this except for using ⌘ Cmd+f for isearch. I stumbled on that because I rebound Ctrl+s to swiper-isearch but sometimes wanted to do a regular incremental search. Even then, it didn’t click that Emacs was emulating macOS keybindings.

Other than that—and examples like it that other users may need—I can’t see the point of using those bindings. It seems like just another way of confusing my muscle memory. Of course, as I’ve confessed before, I’m very bad at handling multiple sets of keybindings.

For me, it makes more sense to make Emacs keybinding available to macOS rather than the other way around. Of course, you may disagree and want to standardize on macOS bindings. The great thing is that, as usual, Emacs2 let’s us have it our way.

Footnotes:

1

When it’s running on macOS, of course.

2

Well, in this case, macOS gets some credit for making it easy to use Emacs binding across the OS.

Posted in General | Tagged | Leave a comment

Casual Timezone

Charles Choi has another great addition to his Casual Suite. This time he helps us with the common problem of figuring out what time it is in some other place. As Choi says, the Internet makes it common to communicate regularly with people from all over the world. Even the introverts at Irreal find themselves dealing with this.

Choi says that the most common way of dealing with the problem is with a clock app—which typically show times from all over the world—or just looking it up on the Internet. I do the latter. When I want to communicate with someone in, say, London, I simply search for something along the lines of “what time is it in London?”.

Choi notes that Emacs already has all the machinery to deal with this sort of thing. It just needs to be pulled together into a user accessible package. That’s what Casual Timezone does. It provides a myriad of ways to map the time at one place to the time at another.

At this point, the Casual Suite has so many useful apps that it’s probably best to simply install the whole suite even if there are some that you don’t use. Choi’s use of transient menus makes it easy to use them without having to deal with a bunch of bindings that you seldom use and probably won’t remember. Take a look at his post for an animation of Casual Timezone in action and see it it’s something that might fit your needs.

Posted in General | Tagged | Leave a comment

Improving Keyboard-quit

Bozhidar Batsov is back with a quick tip that many of you will probably find useful. It’s an improvement to keyboard-quit or, as we all know and love it, Ctrl+g.

One of Batsov’s pet peeves is that keyboard-quit doesn’t function as expected when the minibuffer is active. Happily that and a few other infelicities are easily fixed as he shows in his post. The code that Batsov presents in his post is short. It’s more comment than code yet it does fix the problems that were annoying Batsov.

Here, from the code comments, is what his improved code does:

The DWIM behaviour of this command is as follows:

- When the region is active, disable it.
- When a minibuffer is open, but not focused, close the minibuffer.
- When the Completions buffer is selected, close it.
- In every other case use the regular `keyboard-quit'."

You don’t have to edit Emacs source code. You simply include his function in your init.el and remap Ctrl+g to it. It’s easy to try out his code and if you don’t like it, simply drop back to the default behavior by undoing the key sequence remapping.

Posted in General | Tagged | Leave a comment

Why Does Emacs Take So Long To Load

Over at the Emacs subreddit, EachDaySameAsLast asks the perennial question: why does Emacs take so long to load. Actually, his question is, “Why do people say Emacs takes so long to load?” He has, he says, been using Emacs since its TECO days and has never, even in the old days, experienced overly long load times. To be sure, his configuration file is relatively short—about 100 lines—but Emacs loads for him in under 2 seconds.

Of course, as many of us have been saying and saying, none of that matters. For almost every user, Emacs shouldn’t be started very often: once a day at most, once every week or month typically.

As usual, the interesting part of the post is the comments. Almost everyone agrees: the load times don’t matter but if you use use-package and the defer option judiciously, your load time can be small too.

I’m beginning to feel as if I’m codependent with those people claiming that Emacs takes too long to load. I should probably just stop writing about it. Of course, it won’t matter. People—many of whom don’t even use Emacs—will keep repeating it.

But let me just repeat, with Batsov, that Emacs load time doesn’t matter. It really doesn’t.

Posted in General | Tagged | Leave a comment

Web Browsing In Emacs

Joar Von Arndt has an interesting post on a subject that many Emacs users obsess about: how to bring Web browser functionality into Emacs. As, I’ve said many times, virtually all my tube time is either in Emacs or Safari. I would, of course, like to get that down to just Emacs. To be sure, I do use some other apps but my time with them is basically in the noise. Almost everything I do on the computer involves Emacs or the browser.

Von Arndt looks at eww, w3m, Xwidgets, and EAF. He discusses the pros and cons of each. He appears to think that eww—with some customization—is the best solution.

My solution is to use Xwidgets for rendering Email posts that need it and for my RSS feed via Elfeed. My email client, mu4e, makes it easy to switch between text and HTML rendered displays. It is, in a way, the best of both worlds. I can read most of my emails in plain text, as the elders decreed, but can switch to an HTML rendered display when I need to.

I use elfeed-webkit to display my RSS feed with Elfeed. It brings up each entry in a browser like display and, of course, can be easily be toggled on and off. It’s a bit fragile, as Von Arndt says, but it easier than invoking the brower for each entry.

The sad news is that there still isn’t a good solution but what solutions there are are getting better. Perhaps we will soon have a way of bringing the final major holdout into the Emacs fold.

Posted in General | Tagged | Leave a comment

Adding Timestamped Notes To The LOGBOOK Drawer

Jeff Bradberry has an excellent post on adding timestamped notes to the LOGBOOK drawer in Org files. Most of us are used to using this drawer to record state changes in TODO notes. You can arrange to have the times of the state changes added to the LOGBOOK. You can also arrange to pop up a buffer so that you can add a note to the entry. I do this when the state changes to CANCELLED or WAITING. Sometimes you may want to add a note to a state change that doesn’t normally have one.

That turns out to be easy. You simple add the universal argument to the state change call. If you use the normal Ctrl+c Ctrl+t binding, you would simply use Ctrl+u Ctrl+c Ctrl+t instead when you want to add a note.

Many of you probably already know all this but Bradberry thought it would nice to add arbitrary notes to the drawer as well. That turns out to be easy too. As usual, Emacs has us covered. You simply call org-add-note bound to Ctrl+c Ctrl+z by default.

This post is the seventh in a series on building an Org-mode Workflow. The whole series is worthwhile and you should definitely take a look if you’re an Org user. There are links to the entire series in Bradberry’s post.

Posted in General | Tagged , | Leave a comment

🥩 Red Meat Friday: Load Times Matter?

It seems as if everybody having even a passing acquaintance with Emacs is opining about Emacs load times. That includes Irreal, of course. Most of us take the position that it doesn’t really matter how long it takes Emacs to start because it’s something that happens only rarely.

Every serious person acknowledges that there are exceptions. A (very) few people have to restart Emacs often for various reasons but for the most part the majority of us have no reason to care. Of course, that doesn’t stop some people from caring. And caring a lot.

Over at the Programming subreddit, dormunis1 is proudly announcing that he’s gotten his Zsh load time to under 70 ms. This is down from the apparently normal load time of 0.45 seconds. If you don’t see the problem with this, you should seek help. These times are all below human reaction times so reducing them, while an interesting intellectual challenge, serves no real purpose.

As usual, a lot of the meat is in the comments. Most of the commenters aren’t sympathetic and agree that it’s an optimization without a point. To be sure, learning to do this sort of thing is useful for cases where it does matter. My objection—and that of the other commenters, apparently—is that reducing the load time of Zsh, Emacs, or any other user facing app, by a few milliseconds simply doesn’t matter.

Posted in General | Tagged , | Leave a comment