La semaine du 18 au 24 mai

| french

lundi 18

Je me suis réveillée très tôt pour interroger ma sœur qui est très malade d'un cancer. Nous voulons enregistrer des vidéos pour ses jeunes filles et son mari. Sa fille aînée a commencé à l'interviewer, mais bien sûr, il y a des sujets dont elles ne peuvent peut-être pas parler pour le moment. Je l'ai appelée sur Facebook Messenger et j'ai utilisé OBS pour enregistrer l'appel. J'ai un flux de travail pour corriger et formater la transcription, et je suis ravie de l'utiliser pour ma famille.

Il faisait très chaud. C'était notre première vague de chaleur intense cette année. J'ai emmené ma fille au parc Amos Waites pour jouer à la pataugeoire là-bas. Elle a vraiment aimé la robe-maillot que nous avons cousue. Elle adorait tourner dans le siège pivotant que notre parc à proximité n'a pas. Elle a tellement joué qu'elle s'est endormie sur le chemin du retour.

Après le dîner, ma fille et moi sommes allées à un autre parc pour regarder des feux d'artifice pour la fête de la Reine. Il y avait beaucoup de gens, donc je pense que c'était un rassemblement habituel pour les jours de fête où les feux d'artifice sont autorisés.

J'ai terminé la révision de la transcription de ma conversation avec Prot et Philip. Je pense que l'audio de Philip est parfois trop faible, mais je ne suis pas sûre de pouvoir normaliser juste ces segments. Si j'ai une conversation avec un autre locuteur, je peux enregistrer les flux audio séparément, mais dans une conversation entre trois locuteurs (Prot, Philip et moi), je ne peux pas complètement les séparer. En plus, je pense que je ne peux pas remplacer juste l'audio d'une vidéo en diffusion sur YouTube. Peut-être que je peux mettre en ligne une nouvelle vidéo et changer l'ancienne vidéo en une vidéo non répertoriée.

À l'heure du coucher, ma fille et moi avons parlé de la neurodivergence, des mathématiques, et des facteurs humains comme les limitations de la boucle auditive comparée à la visualisation. J'adore lui parler de son cerveau.

mardi 19

J'ai essayé de virer de l'argent aux Philippines via Wise. C'était réussi.

Je me suis entraînée aux virelangues. Oups, j'ai oublié de confirmer l'audio sur OBS, donc je ne peux pas l'analyser.

J'ai réécrit deux transcriptions pour les entretiens de ma sœur.

J'ai emmené ma fille au parc pour jouer avec ses amies. J'ai oublié les glaces à l'eau, donc je suis revenue à la maison pour les retrouver.

Nous avons pratiqué les permutations et la division posée.

mercredi 20

J'ai réécrit encore des transcriptions pour les entretiens de mes nièces avec ma sœur. J'ai configuré un serveur dans notre réseau pour les héberger avec l'authentification basique.

L'école avait un remplaçant aujourd'hui. Il a accidentellement éjecté tous les élèves de la salle de réunion virtuelle et tous ont dû attendre que l'enseignant corrige les permissions.

J'ai ajouté un gousset aux shorts de bain de ma fille.

J'ai emmené ma fille et son amie au parc pour jouer. Elles se sont amusées à me donner des décharges avec l'électricité statique. Après que les autres amies de ma fille sont arrivées, ma fille semblait un peu surstimulée. Elle est partie seule et elle était grincheuse pour le reste de la journée, pauvre chérie.

jeudi 21

J'ai discuté d'Emacs avec Raymond Zeitler sur une diffusion en direct. C'était la première fois que je lui parlais en vidéo même si nous correspondons depuis 18 ans via les commentaires sur mon blog.

Le dentiste a fait deux plombages. Il a proposé un plan de traitement, mais c'est cher, donc je veux bien y réfléchir avant de procéder. Je pense que je veux gagner en confiance avec ce dentiste d'abord. On dirait que la restauration précoce est mieux que d'attendre pour les dents cariées selon les recherches, donc c'est bon, mais on dirait aussi que d'autres dentistes recommandent d'autres niveaux de traitement. J'aime les précautions COVID que ce dentiste prend. Il y a d'autres dentistes (un peu loin) qui prennent aussi ce niveau de précautions, mais ils disent probablement la même recommandation (c'est la même recherche), donc je ne cherche pas particulièrement d'autre conseil. Je ne veux pas passer pour une vache à lait, tu sais?

vendredi 22

Je me suis réveillée tôt pour une conversation sur la communauté Emacs et l'IA avec Matei Candea, un anthropologue. Il pense à faire une étude ethnographique, et je pense que c'est potentiellement intéressant.

J'ai terminé la transcription de ma conversation avec Raymond Zeitler sur Emacs. J'ai remarqué que j'utilisais le mauvais horodatage pour publier les chapitres à partir de la transcription, donc j'ai corrigé l'erreur.

Ma fille n'a pas voulu participer à l'école parce qu'il y a eu un remplaçant, donc elle a fait une pause.

J'étais fatiguée, donc j'ai fait une sieste.

J'ai emmené ma fille au cours de rattrapage de gymnastique. Elle a pris plaisir à apprendre la gymnastique aérienne. Après le cours, ma fille a voulu aller au parc asperge (St. James Park) parce qu'il y a un grand toboggan. Elle s'est entraînée à descendre le toboggan à de nombreuses reprises. Après avoir fait ça, nous avons acheté du sushi. Elle a essayé la tempura de crevettes et elle l'a aimée.

samedi 23

Il a beaucoup plu et c'était très venteux, donc nous sommes restées à la maison au lieu d'aller à la célébration de printemps à la ferme Riverdale.

Ma fille et moi avons joué à Stardew Valley avec le mod Tileman Reworked, qui me demande d'acheter les tuiles auxquelles je veux accéder. J'aime parfois jouer à des jeux avec des limites comme Minecraft Skyblock parce que les limites focalisent l'attention et la progression est très différente. Ma fille préfère notre jeu précédent avec le mod Stardew Valley Expanded.

Pour le dîner, nous avons mangé du sotanghon, qui est une soupe aux nouilles et au poulet. Nous avons aussi essayé le taiyaki congelé. C'était pratique et acceptable, mais bien sûr le taiyaki chez Pat Mart est meilleur.

À l'heure du coucher, ma fille et moi avons discuté de la neurodivergence, de la double exceptionnalité, de l'apprentissage des élèves doués, de la différence entre la récupération d'information et de la synthèse. Nous avons aussi discuté de la faune, des maladies, des vaccins, et d'autres sujets.

dimanche 24

J'ai parlé avec mon mari du TDAH. Il pense que je suis juste préoccupée, et ce n'est pas grave. C'est bon. Je ne veux pas laisser ma vie être perturbée au point d'avoir des problèmes dans deux zones ou plus dans ma vie pour obtenir possiblement un diagnostic, ce qui ne m'aiderait probablement pas beaucoup plus. Quand même, je peux continuer d'explorer comment je peux m'adapter à mon cerveau et ma situation.

Ma fille et moi avons préparé du lait au sucre brun et aux perles boba faites à la main.

Mon mari, ma fille et moi sommes allés aux Stockyards pour faire des courses. Nous avons acheté une boîte de mangues, des perles boba, des haricots azuki, et d'autres aliments. Nous avons préparé une fournée de mochis aux haricots azuki.

J'ai recherché quelques dessins pour les transcriptions. Je pense que je veux inclure les noms des interlocuteurs dans la marge gauche et les horodatages dans la marge droite. Je veux aussi réécrire la transcription pour supprimer les mots de remplissage.

Pour le dîner, nous avons mangé du curry japonais.

Je me suis couchée tard parce que sur Stardew, j'ai finalement accédé à la caisse chez Pierre pour acheter des graines dans la troisième année. La progression est très lente. Heureusement, le mod HibernationRedux me permet de sauter le temps pendant que j'attendais la croissance des arbres.

View Org source for this post

Transcript of chat with Matei Candea about Emacs and AI

| emacs, ai

This is an edited transcript of my chat with Matei Candea, an anthropologist who is curious about the Emacs community and AI. Sharing it here with permission so that it becomes a thing I can refer to and in case it sparks further conversations. AI is a bit of a contentious topic, so I hope people will be patient and kind as we figure things out!

Related links:

Expand for the transcript

NOTE Matei is an anthropologist; ethnographic research

What I actually do for work is to do ethnographic research, to interview people. I've written a lot about scientific communities.

For instance, I've written articles on behavioral scientists who work with animals and how they think about knowledge and technology and stuff. Completely independently of that, I kind of got into Emacs and got really excited. About four years later, I was, like, wait a minute, why don't I do an ethnography of Emacs as a community?

Sacha: Really cool people.

Matei: Right? Really cool people.

Curious about Emacs as a community in the time of AI

Matei: I think what I'm really saying is Emacs as a community in the time of AI and how that's shifting or not shifting how people are using it, and what it does. I've spoken to Prot on Monday. That was the first interview I did, and we had a great chat. I basically asked him how he got into Emacs and what it meant to him and what his relationship is to the community and stuff, and then a bit about AI and then a bit about what he feels are the interactions between the two.

Matei: That's, broadly speaking, what I would be interested in doing with you.

Matei: If you think there's a broader conversation, we could live stream and have an actual chat about how people use Emacs. By the way, I'm very happy also to tell you where my own trajectory was that I got into Emacs weirdly and randomly about a year before ChatGPT really hit the mainstream. The thing that you read by me was written because me and Ella together were trying to figure out Cambridge's response to AI as a university. Like, what are we going to do about it? If I'm going to be talking about that, I need to know how it works. But I don't want to use AI in my own actual work or in my teaching, because I think it's a bit dodgy. I don't really like it. Why don't I just do it with this kind of side project I've got, which is learning Emacs, right? And the weird paradoxical thing was that I now basically kind of live in Emacs. My email is mu4e. If you saw my screen now, the notes are basically a narrowed Org buffer with questions. Everything's email. But I don't think I could have got there that fast if it hadn't been for the fact that I started asking ChatGPT, like, "Oh, this isn't working. Can you just write me a defun that does this?" I'm not completely vibe coding. I'm trying to learn Elisp at the same time, but I'm in this weird position where... Anyway, this is why for me it raised these questions of: what does learning Emacs in the time of AI mean? As you can probably gather from the manifesto, I'm not pushing it at all. I'm really ambivalent about the use of AI. I find myself doing it and kind of sort of worrying about doing it. Would you be happy to do an interview like I did with Prot?

Sacha: Yeah, we can certainly do that. In addition to whatever I can share from my personal experiences, I think your interest in understanding and describing the community and the culture and how it's interacting with this AI thing, I think it'll offer a perspective that is different from what you usually see, because Emacs users have had this long tradition of fiddling with things and making it really malleable and fitting it to them and figuring this out in dialogue. It's figuring out in dialogue with themselves as they figure out their workflows, with the software as they learn from the code, with other people, with resources on the internet not necessarily attached to specific people. That's got a really long history. It's really interesting to see how AI both has plus sides and minus sides in this whole mix. It definitely, I think, will offer some insight that you won't hear with the frothy AI hype that other communities have. It's all very interesting.

Matei: Amazing. Let's start with a general kind of interview thing.

How did I first get into Emacs

Matei: How did you first get into Emacs?

Sacha: I was going through all the books in my university library about computer science. One of them was Unix Power Tools. I was like, there's this chapter on Emacs, and it mentions Tetris and other things. What is going on here? I tried it. It was great. I liked it. Then in fourth year or so, my screen stopped working. I didn't want to replace it. But there was Emacspeak. I was amazed. Lots of people had put together Emacspeak so I could use the computer with a broken screen. I could still read it periodically, if I tilted it and kind of looked at the low contrast thing… The speech synthesis worked just fine. I'm going to program this way.

Sacha: I'll plug into a monitor when I'm back in my room. But if I'm out and about, I have this other way to do it. Something that maybe most programs would not have anticipated, but because somebody had built it for themselves, it was something I could use. Before I got into Emacsspeak, I got into Planner Mode because I was a university student and I was taking notes. Planner Mode was an easy way for me to keep track of tasks. It was more flexible than other to-do managers.

Sacha: It's one of the packages that was popular before Org Mode. I started using that to write my blog. Blogs had just been invented around then. I was figuring out, how do I export RSS out of this? I was able to customize it to do that. I liked it so much I emailed John Wiegley, who had created Planner Mode. I said, hey, I can help you fix bugs. He said, great, you're the new maintainer now. Which was actually very good for me because I was a university student in the Philippines, and Philippines, and normally we don't get to work on anything really cool. Suddenly I was in this global community of people. There was a mailing list. People would send in questions or feature requests. I would share the things that I was working on. They were very, very patient with me. Like that one time, one of my changes accidentally deleted somebody's notes and they were still nice to me afterwards. The community has always been part of how I experience Emacs. Learning in public has also always been part of how I've been figuring out what I can do with it and changing it to fit my needs, as very idiosyncratic as they are sometimes... It has also always been part of my experience of Emacs.

Matei: When did this start?

Sacha: Very shortly after I started Emacs, I started blogging with it. My first blog post from that is 2001.

Matei: Right. You were studying computer science?

Sacha: I was studying computer science, yes.

Matei: Are you a computer scientist now? What do you do when you're not doing Emacs?

Sacha: Most of the time, I'm still focused on full-time parenting, which is why I'm going over to the freezer now to remember to put yogurt in the freezer. I do a tiny, tiny, tiny bit of consulting, but consulting, but for the last 10 years or so, I've just been focused on parenting. Playing with Emacs and being in touch with the Emacs community has been one of the ways that I've kind of kept sane. I've enjoyed the intellectual puzzles of: I have this thing that I want to do, how do I do it with code in ways that I can fit into five minutes here, ten minutes there of my life.

Matei: Do you do any other coding or just Elisp?

Sacha: JavaScript, Python on occasion. Some of my consulting involves making little JavaScript prototypes for ideas that my client has, but it's really just an hour a week, maybe less. But for fun, I still write a bit of JavaScript and Python. Emacs Lisp, however, is what I usually write because it's so much easier to do things when you've got the full editor with you.

Matei: Yes, that makes sense. I've got a million questions, but I'm going to try and do them in order. You've said a little bit about this already, but

What do you love about Emacs?

Matei: what do you love about Emacs?

Sacha: You can come up with a crazy idea and you can actually make it happen. So, for example, I've been doing a lot of conversations, interviewing people or working with my sister's interviews. I always like turning these into text because text is a lot more searchable. Chapters and things like that too, right, so that people can jump to just the part they're interested in. I don't know how other tools do it, but I love the fact that I can modify Org Mode so that I can capture timestamps. Wall-clock time is easier for me to work with. I can say, okay, while I'm typing, I just use an abbreviation to put in the timestamp that's the current time and my rough notes. I have another piece of code that translates that into offsets from the start of the video based on YouTube's live stream or the file name of the video. Then I can paste that into the subtitle file so that it automatically puts the chapters in roughly the right places. As I come up with little workflow ideas, I can actually implement them.

Community

Sacha: I also love the community of it. Looking through the blog posts or as I put together Emacs News every week, there's always all these interesting examples from people who are asking the same questions about about "What is it I want to do?" and "How can I do it 0.5% better?" They write these little functions. I'm like, oh, that is a fantastic idea. I get to absorb that into my life. Because I'm seeing it in the context of their blog post or their video, you get a glimpse of other people's lives as expressed through code, because all of the code is very personal. That is one of the things that is good about the fact that people are using AI sometimes to generate this code. They can make things that things that punch above their weight. A newcomer to Emacs can have customized functions that let you fully appreciate its power. But on the other hand, if the AI is just generating this code, you don't get a sense of like, where's the blog post this is coming from? Or who would I talk to to keep up with other crazy ideas they come up with? You're limited to just your ideas. Then there's the whole thing about license-washing. Most of the people release their code under GPL because it's Emacs, but the large language models never mention that. They never say, you also have the right to go and share this and modify this and build on top of it and contribute back to the community. Anyway, it doesn't feel right, the code. It doesn't quite get the conventions and the idioms yet. So the things that I love about Emacs are generally the fact that it can fit me like a glove and it's got this community of people who are also exploring what is possible as crazy as ideas sometimes get. There's always some way to hack it in.

Do you know how big the community is?

Matei:

Do you know how big the community is?

Sacha: I have no idea. We generally feel like it's a lot smaller than VS Code and probably a lot smaller than Vim. It depends, of course, on if you're talking about percentage, it depends also on... There's a lot of Clojure developers using it, because it's the standard Clojure way of doing things, but there are probably a lot fewer Java or JavaScript people using it because a lot of people are in VS Code instead. I used to do Google Analytics tracking on my website, but I stripped all of that out because cookies and tracking and all of that. When people ask me how many people read this stuff, I have no idea, but I do know that every time I look for Emacs News, I'm delighted by the breadth that I come across. To me, it feels like there's a thriving community that's large enough for my interests.

Matei: Cool. You're the second person I've actually spoken to. The first person was Protesilaos. I'm struck by the fact that from a sample of two, I've got two people who are not based in the US, who are super international, and also who are not developers.

Sacha: That is a fantastic thing about it. I love that we have researchers and sourdough bakers and knitters. Of course, the programming part is still there, but a lot of people end up getting into some kind of programming because of Emacs. Emacs is the only thing they ever code, and they don't even think of it as coding. It's just like, I do this, but I wanted to be able to do this, so I learned how to do Org Mode and source blocks, and that's all I can do, but it's great. I think that's really interesting because when you talk to people about their origin stories with Emacs… Sure, of course, you have the pockets of people who are like, I'm a computer science student and my professor said use this, so I'm using this, and so forth. But then you get these random high school music students who are like, oh, yeah, I just saw this video and I thought it looked really cool, so I taught myself how to do that. I don't know anybody else who uses it in real life, but I like it. Musicians using it live to do performance... Where are these people coming from? But they come across it, and it just strikes a chord with them, deep in their souls. It appeals to a certain tinkerer type, I guess. They just continue with it. They get stuck. Sometimes they leave and they come back, and all that stuff… But the breadth is one of my favorite things about Emacs.

Matei: Do you think that most of the people in the community are probably developers? Because when you were saying the community, you compared it to Vim and VS Code, which is to think of it really as an IDE kind of thing.

Sacha: That's usually what people talk about, right? Because usually when people are thinking, how popular is this, they're stacking it up against developer tools because those are the surveys that the development websites do. Stack Overflow or State of Clojure or whatever. They'll ask people, “What editor do you use?” But given Emacs' surprising popularity among people who are, for example, diagnosed with ADHD and find that Org Mode is the only way they can manage their brains…

Matei: Is that a thing? That's really interesting.

Sacha: In a number of Reddit threads that I've seen, people are like, yeah, I'm not a programmer, but Org Mode is the only way that I've figured out how to manage my brain. Or people will come to Emacs from something else specifically for Org Mode because of the way that it can help them manage their tasks or agenda, because they can sculpt it to fit what their specific workflow could be. It's amazing. Of course, we've got the writers and the researchers who are like, "I love publishing beautifully typeset things, but I don't like working with LaTeX all that much, so let me just figure out the template once."

Matei: Yeah, totally. I really came to Emacs because I was looking for an outliner. I'd been writing in Markdown for a while. I was really getting sick of the heavy Word stuff. And I was, like, Org Mode, omg, it's amazing! Then from there, I was bitten.

Do you have any frustrations with Emacs?

Matei:

Do you have any frustrations with Emacs?

Sacha: I would like to have more time in the day to fiddle with things. In terms of the balance between fiddling with my config and doing the thing that I want to do, if I sandwich it so that I do my 5 to 15 minutes of Emacs fiddling at the start, then I'm motivated to go through the task because I want to test that my improvement works. Then it becomes a good balance for me. I don't spend all the time feeling like I'm yak shaving, and I don't spend the time struggling with workflow because I didn't take the time to automate it.

Sacha: I would like to have more time, because I always come up with more ideas in the middle of something. "I know this is possible. I just have to sit down and do it, and it'll be great. But okay, I have to wait till my next 5 to 15 minute window where I can fiddle with it again." The other thing that I've been trying to figure out is: how do you help people develop that intuition for how to do things, how to make Emacs do things? We see a lot of people come into the community. They might get stuck on some things. The tutorial is very useful, but it can be overwhelming. The whole Emacs thing can be very overwhelming for people. How you help people get through that part is something that's of great interest to me. Bringing it back to AI and large language models, the fact that people can sometimes have a conversation with this endlessly patient tutor where they might be too embarrassed to ask their questions on a mailing list or a forum, I think that's fantastic. But also, going to your manifesto's points about learning by doing and education and the eureka moment, we also don't want this quick and easy help to rob people of the understanding that they get from looking at it and tweaking the code or learning how to read through the source code themselves. There's just so much there that I would hate for people to just get stuck in the “please generate this code for me" level rather than be able to learn this is how I start learning from other people's source code so that I can come up with more ideas.

Matei: That's right. That's also what I think basically. Here's an interesting question.

Would you ever leave Emacs?

Matei:

Would you ever leave Emacs?

Sacha: I cannot imagine an editor at the moment that would let me get away with nearly half of the things that I do, but maybe even less. Right now, I've got so many odd little customizations for it. For example, on my phone, I'll use Orgzly Revived to capture a quick note so that I can go back into Emacs later and do it. But even though I'm comfortable programming in JavaScript and Python, and there are lots of tools available there, the interactive interface part of things is something that I don't see any other program give me the same kind of platform of support or building blocks to play with. Who knows? If some day, this thing manages to support all of my hacks built on hacks and gives me that same kind of feedback loop, but it's also multithreaded and graphical and whatever, I might give it a try. But at the moment since I can get away with so much in Emacs and I know that people behind the scenes are working on adding even more to it, it's okay, long term. It's been around for 40 years. It'll be around for... Probably it'll outlive me. I don't have to worry too much about giving up on it.

How important for you is the free software bit of Emacs?

Matei:

How important for you is the free software bit of Emacs?

I was on Mac when I got into Emacs. I went to GNU Emacs to download it and it said, we made this available to people on proprietary systems in order to teach you to free yourself. I was like, huh? I downloaded it and I'm now running Arch Linux. It definitely worked. Richard Stallman has downloaded himself into my brain. How much is the free software bit of it important to you in using Emacs?

Sacha: I'm not a purist. I will happily be the interface using the non-free things. For example, when we were doing EmacsConf, the first few years before Whisper was around, I was the one doing like, okay, fine, YouTube has this subtitling thing that we can grab the stuff from. Yeah, it's a non-free service, but I will happily take advantage of it in order to make the information more free, and things like that. I use both free and non-free things, but I love the single-minded focus that a lot of people have on freedom and making sure that other people enjoy these rights. For example, in the Emacs community, a surprising number refuse to use JavaScript because a lot of JavaScript is non-free software. I want to make sure that my website still makes sense without JavaScript. EmacsConf, there are ways to participate even participate even without JavaScript. You can use MPV to watch the stream. It's all free software. You can use IRC to chat. All that stuff is very important to people, and that's great. I love the fact that for a lot of people, they really care about making sure other people can continue to enjoy these freedoms to modify things and to build on it. Every so often someone comes into the Emacs community and they're like, oh yeah, I want to make money making packages here. I'm going to put my package behind a paywall. You've got to send me a donation in order to use it. Then they get smacked down so hard. Usually the way it works is someone will then, you know, take a look at their README and say, okay, that looks vibe-coded. I can do it faster and I'll do it for free. That's the usual response to this stuff. Yeah, here's the thing that you're trying to sell, but it's free.

Matei: So that never works. I was struck by this. It seems to be so absolutely immune to takeover by proprietary stuff.

Sacha: I mean, it's a startup hustle mentality in other communities, but in Emacs, it does not fly. Mostly because people are, like, are, like, I know the tools you're using, I can do that better myself. There are people who do get sustained by donations from Emacs community members, but it generally is more of a "I appreciate your work and I will send you this voluntary donation" instead of your paywalling your stuff behind this thing, which feels very much against the ethos of the Emacs community. It's been interesting to see the AI hustle "software as a service or product type" thing try to infiltrate the Emacs community, and they are having none of it.

Matei: Interesting. Why do you think it's so resilient to that?

Sacha: Because we've had such a long tradition of sharing things for free, building on top of things that people have freely shared: not just like free as in beer, but free as in you've got the source code, you've got all the rights to do whatever you want with it, including for free. That's baked into the community. Any time someone comes in and tries to say, oh yeah, I've got this commercial packaging of Emacs, it's all rights reserved, people are like, yeah, there's probably a GPL violation right there, so let's go.

Matei: Cool.

How do you explain your passion for Emacs to non-Emacs users?

Matei: How do you explain your passion for Emacs to non-Emacs users?

Sacha: I don't usually. I love the fact that I can tinker with it, right? If it clicks for people, it clicks. But if it doesn't click for people and they don't necessarily want or need that, then it's okay for them to use something else. I love the fact that people are using or even shifting to other editors. For example, we've had a couple of people announce that they're leaving Emacs recently because vibe coding has made it possible for them to build native applications and they don't have to build it on top of Emacs anymore. They can finally get their Vim config set up the way that they wanted to because the LLM can generate that stuff for them. Whereas in Emacs, it would have been a lot easier to write it themselves, but now they can do it with VS Code or whatever. It's great because the more people are experimenting with interesting ideas, even outside Emacs, the more we get to steal those ideas and then bring them back. You see a lot of this sometimes. You see people re-implementing cool ideas from other editors or other tools. To me, it's totally okay if other people use something else, especially if they tell me the cool stuff that they think only that editor can do. Because I'm like, that sounds like an interesting feature. Do tell me more. There was an interesting talk by Jeremy Friesen in either last EmacsConf or the one before that, about mentoring and how he's no longer trying to push people to use Emacs. He wants to share the general workflow practices he's using. If he's pair programming

Sacha: with someone, he might say, how do you jump to a specific function definition? They might show him something, or they might realize that's a thing. I can go look in my editor how to do that. He might show, this is how I do it. That's the general idea. Sometimes when people start talking workflow, then talking workflow, then talking workflow, then people who are not using Emacs will go, "That looks really cool. How do I do that?" Then that?" Then you send them down the path of: get it installed, go through the tutorial, that sort of stuff. But it always helps to have that specific reason, the thing that they want to be able to do. For me, for example, I love the way that Org Mode lets me have my notes and the code and the links. It's all one big thing. I don't have to think about, oh, okay, I have to do everything in Python because that's what Jupyter does. I can do some of it in Emacs Lisp, and I can do some of it in shell scripts, and I can do some of it in JavaScript or Python. It's like all this big mess Org Babel kind of thing. Yeah, because your brain might not be in tune with all those different languages, but it works for me. If other people see that and they say, I want to do that too, then that's when you help them get into Emacs. But aside from that, I don't talk to people in elevators and say, have you heard the good news?

Matei: I was wondering even more broadly than kind of people who are already coding with a different editor. To tell you a story... My cousin is also an anthropologist. He's an anthropologist in France. I've known for years that he was into Linux and free software and stuff. When I got into Emacs, he said, you know I've been doing Emacs for 10 years. I was like, what? How? What? And he'd never told me. I realize now, having been doing Emacs for four years, I can't talk to my colleagues and friends about it because they look over my shoulder and it's like, what are you doing? This looks like it's from the 1980s. Even trying to explain to people what Emacs is... I don't mean coders, I just mean people. My cousin said, yeah, I talk to people about free software all the time. I've never talked to anyone about Emacs. It's just so weird.

Sacha: I think that's why the community is so important, right? I aggregate a lot of blogs on Planet Emacslife so people can bump into each other. There are a lot of meetups, some of which we host on BigBlueButton... There are meetups, by the way. If you check under Emacs News, there's actually a very active London meetup.

Matei: I haven't yet.

To what extent do people meet in person with Emacs?

Matei: To what extent do people meet in person with Emacs?

Sacha: Apparently, a lot of people meet in person whenever they're lucky enough to get a sense that there are actually other people in their general geographic location who are interested in this. But there are also a lot of people who meet online. Org Meetup has a meetup every month that has about 20 people in it.

Sacha: Emacs Berlin has a meetup that's hybrid, and so it's both in person and online. There's Emacs Asia Pacific. There's a whole list of meetups in Emacs News, which is that newsletter that I do every week. I list upcoming events, and there's also a link there to the calendar as well as to the user groups page which lists by region. There are a lot of people getting together about Emacs because a lot of times, you learn about Emacs by looking over someone's shoulder, physical or virtual, right? This is how you learn about things that you would not have even thought of asking an AI about. They're doing a demonstration or they're doing a video, and you're like, what is that thing that you just did? They had no plans to talk about it because it's just something they take for granted. It's a keyword shortcut or a command. It's just part of the workflow. They don't think about it anymore. Or it's even as simple as "What's that theme? What's that font?" Because people can see it, can see somebody doing stuff with Emacs, they get inspired to learn more and to adopt that into their workflow. That is one of the things that I love about how people learn Emacs. It's very convivial, right?

Matei: Yeah.

Learning in public

Matei: You said the phrase earlier: learning in public. In one sense, that sounds scary. Learning in public, making mistakes in public and stuff. You said it as a really good thing. Tell me more about learning in public.

Sacha: My favorite kinds of blog posts is

Sacha: when I'm proud of myself for figuring out something clever. Like, okay, here's this function function to do this thing. I had to figure it out. It was hard. It took like a day or two to do it. Then someone comes by in the comments and says, oh yeah, that's built in.

Matei: Yeah, I've been there.

Sacha: "You just change this variable." It happens so often. The reason is because Emacs is so big, right? There are variables and functions that I would not think of coming across. Maybe I'm not using the right words to search for them, or whatever. If you add to that the entire package ecosystem and as well as the things that are not people's packaged code, snippets in people's config and whatnot... Chances are someone has come across the same problem that I'm thinking about and has come up with a more elegant solution for it. If I'm not using the same words, I might not find it. One of the things that I like about large language models is that even if I use my words, sometimes it will suggest something that does that translation, right? It's an approximate search. But even if I don't have that, if I'm writing about something, then I have that opportunity for somebody to say, oh yeah, you should check this out. Or several years later, someone might also say, that is exactly what I was trying to do. I'm taking your code. I've built something on top of it to make it even better. For me, writing about what I'm learning

Sacha: with Emacs is a great way to learn even more from the community. I keep trying to convince people, yes, please, even if you're a beginner, write about what you're learning, because it's a great way to crystallize that knowledge for yourself, become part of the community and part of the conversations, and learn about things that you would not have thought of asking about.

Matei: Well, I'm following your example. I'm trying to write my config in Org Babel at the moment, partly as a way to say, wait a minute, what is this thing? How does it work? It's so useful. But one thing I was wondering, and it's partly also just a practical question,

Disclaimers

Matei: I've never tried to contribute or to post

Matei: anything on anything, partly because I worry that my stuff is crap.

Sacha: If you put a disclaimer, that way they know they're reading it for the idea, but not necessarily the Emacs Lisp style. That's fine with me too. There are a lot of people who are like, you know, it's got too many emojis in it, I'm not going to read that. I'm going to focus my time reading something else that's been handcrafted and all that stuff. That's fine too. There's room for all sorts of people and all sorts of approaches to this. Sometimes even just the idea of something is already valuable, that somebody thought of saying, hey, my workflow would be better if it could just do this. If there's a screenshot, even better, right? You can see how it works. Screenshot or video or animated GIF. Because then they can go and write the code that they would have to do anyway. Because of course, they've got their own personalized setup. You know, the code that you write will not mesh perfectly with their particular setup. There's this whole… There's this Lisp curse essay that's sort of related to…

Matei: I was going to ask you about that.

Sacha: We've all got our ecosystems of our own code and absorbing something into it is sometimes hard. But if you start with even just the idea that somebody else has written about, whether or not you take their actual code for it or use their code as a building block, that is already useful and interesting. Again, you don't have to be Bozhidar Batsov or Omar Antolin to be able to contribute at that level. Even at the beginner level, you could just be like, I just need to do this thing and it's driving me crazy to do it manually all the time. Then I'm like, you can do that non-manually? Oh yeah, we should do that.

Matei: Cool. Just to come back to the question about talking to other people about Emacs, do you ever talk to people who are not programmers?

Do you ever talk to family and friends about Emacs?

Matei: Do you ever talk to family and friends about Emacs? Do you ever have to explain what this thing is that you're doing or do you just not?

Sacha: Well, my kiddo is 10, and she's like, can you set me up a kid Emacs? Because she sees me like... Yes! Clearly something of great interest to me. I said, maybe. She does a little bit of vibe coding with Claude as she generates interactive stories. She was trying to track down a syntax error at some point. I was like, can I just install Emacs on your computer so I can do... And she said no. My husband uses Vim.

Sacha: Although he did get very interested in Org Mode at some point, so he found the appropriate Vim plug-in for it. That was amusing. I don't talk to people about editor choices. I just do the stuff that I do. When I write about it, sometimes people will come across it, again, coming from completely different backgrounds. They'll be like, oh yeah, I also need to edit transcripts. What is this Emacs thing? And I'm like, well, it's a very long road, but it's a lot of fun and it's worth it. If you do want to get into it, here's some ways to get started. I don't know. But you can look at the videos first to see whether it might be something that resonates with you.

Matei: Yeah. No, I'm the same. I'm very cautious. I've seen that. The learning curve thing is so cool. My kids are like, your computer used to be so pretty when it was a Mac and now it just looks really ugly. I'm like, oh, if you knew. It's so much more beautiful now, but never mind. Cool. We've talked a lot about AI actually already.

Do you ever use AI in chatbots for anything else?

Matei: Do you ever use AI in chatbots for anything else?

Sacha: Well, I'm learning French at the moment. In this case, the kind of the regression to the mean that AI does is very useful for me because I need to know, what is the common word choice here? How do I get the grammar to do the thing? I don't really want to spend an hour of a relatively expensive tutor's time picking apart my subject-verb agreement or my nouns agreeing in plurality with the verbs and stuff like that. It's reasonably acceptable to use large language models for language feedback. That makes sense. In terms of coding, I'm not there yet. Quite a few people are very enthusiastic about it. Even in Emacs, some people are like, "I don't write my code anymore. I just vibe the whole thing." I love the way that it gets a lot of people to make things that they would not otherwise have the time or effort or experience to do, but on the other hand also, it hallucinates a lot of things. It gets me excited: oh there's a variable or function specifically for this? No! It doesn't exist. I can make it exist, so it's a little less frustrating for me, because I can say, you know, that does make sense. I can write that. I can fill in the blanks for it. But 9 times out of 10, I'll be like, no, no, go back and do the proper search. One out of 10 times, it'll tell me, oh yeah, there is this function and it will exist, exist, then I'm like, okay, great, I want to use that, because I wouldn't have otherwise come across it. But I cannot use it to generate a lot of code because I get this urge to just rewrite things to fit the way I want. I just use it like… it suggests ideas. It acts kind of like a search engine that gets things wrong most of the time. I'll just take the interesting parts of that and do it myself. Aside from that, I haven't really dug into it to the extent that other people have. I am happy to take a step back and see how this all shakes out because with the shake-up in pricing and all the externalized costs that are slowly being factored in, I'm not going to build a house of cards on it.

Matei: Yeah, that's very wise, I think. How do you feel about the fact that these models have been trained on all these free conversations? They just suck up all this stuff that people have been doing for 40 years. Is that a problem in and of itself?

Sacha: It's interesting in the particular case of Emacs. As I mentioned, the vast majority of Emacs Lisp is released under either the GPL or the MIT license or even public domain because people in Emacs really care about sharing stuff and they want other people to do it. It's not like, oh, we've got this proprietary code and it's been stolen away from us, it's us, it's not available for other people. The fact that we're treating AI-generated code as non-copyrightable, it's okay that it's sort of out there. It would be nice to be able to say, hey, this stuff is GPL, so if you're going to build on it, please share it under the same licenses. But in terms of the way that many people use it for personal configuration and learning, I'm okay with that. I know that other people in the community have stronger stances, and that's also okay. Because there's no attribution, there's no link back to the person. The licensing doesn't require [lots of] attribution. You don't have to say, oh yeah, this config was inspired by these people and at these links. You don't have to do that, but it would be nice to be able to follow those links back to the people. That would be nice. The ability for more people to learn from this stuff is good. If we can encourage them to share what they're figuring out with other people, that's also good.

Matei: So is the problem less about kind of taking intellectual property and more about

Not breaking connections to people

Matei: breaking connections to people or like breaking these traceable connections to other people in the community?

Sacha: That's the part that I'm interested in and care about, because I feel the community experience of Emacs is very interesting. All the other stuff, there are people who are far smarter than me and have focused on... This is above my pay grade, right? Actually working out intellectual property, what that means. A lot of people think about copyright and copyleft and that stuff. I will leave that to them to sort all of the ethics after that one. I just care about making sure people can feel like they're learning, feel like they're welcome, and can find the ways forward both with assistance of large language models if they want to, but also connecting with real people who they can learn from too.

Matei: Yeah, super. I think that's sort of the questions I had, really. I'm sure I'm going to have a million other questions. I might email you back about this. Did you have any questions for me?

Education and ethics and eureka

Sacha: I love now knowing that you were writing your manifesto with that experience of being an Emacs user in mind, because the way that the education and ethics and eureka was like, that actually lines up precisely with the Emacs community and what it's like and what we care about. I would love to explore this in future conversations and see how we can help people navigate this time. There's a lot of froth about AI, and the business world is losing their heads over this collectively. The programmers in industry either find it useful but also, in general, seem to have a fairly worse experience. This is not where we should be using this. This is not how this is supposed to be turning out. It should not be leading to more unhappiness, but it is. It would be interesting to sort out both in the society level, but also in the individual level, as people make their own choices about what to use and how much to use it for, and also the impact, even if they're not making those choices themselves. I think the general sense now, for at least Emacs and Org Mode, is "we're not going to accept LLM-generated contributions because we've got to have a person who can stand behind the code." We so far have been safe from the inundation of generated pull requests that are plaguing other open source projects. It's definitely something to watch out for. But there is some tension. People are proud of their vibe-coded projects, but on the other hand, people are like, well, it takes 5 minutes or 15 minutes to generate this, and because it's not really maintainable, people will lose interest in it after their 15 minutes of fame on Reddit with their nice screenshots and all that. It's not going to keep moving forward.

Matei: Is that kind of like a… version of the Curse of Lisp written large? Everyone's just going to write their own programs at home and no one's going to be talking to each other anymore.

Sacha: It is very similar to that. that. It can be a problem. It can be an opportunity. It's not one or the other yet. We're figuring out as a community and as individuals how to navigate this. We have this long history of people not actually being able to adopt to adopt someone else's code off the shelf. It's amazing when someone actually puts together a package that can cut across a large variety of use cases. It takes a lot of work to get there, but things like Magit and Org Mode, how do these things happen? Yeah, it's fantastic. I love the fact that we can look at things

Sacha: like consult and vertico... The fact that they can work for a lot of people is amazing. It's actually pretty rare in the Emacs community. But for the most part, we are in our little fiefdoms and we have to make an effort to do that kind of connection. Whether or not the other person is using vibe-coded code doesn't matter that much. There's still that barrier. Higher barrier if you're dealing with vibe code because they don't understand it and you don't understand it and the code is hard to read. The ideas can be transmitted over blog posts and videos. But at the same time, the fact that more people like you can use this to start to experience the power of Emacs, the customizability of it, and can then go on to imagine, hey, is this what software could be? Can it be personal? Can it be malleable? Can I say, "No company is going to anticipate this particular need, but I can make it for myself."? I think that's really worth it. If the tools will help us get there, and if we can find our own balance of ethics that are okay with this... Some people might say, no, definitely not for me, even if it gives me the power. Some people were like, I just want to get this stuff working. That's cool, too. We get to see how that all works out.

Matei: It's interesting. I've written this paper for which I gave a talk in Oxford a couple of weeks ago about this, really for anthropologists. It's anthropologists. It's very interesting that a lot of the things we were talking about today, I thought that might be the case on some of these things. It's partly thinking about the way in which AI, ChatGPT, whatever, kind of interferes, becomes like a broker between the community and the individual. So the good side of it is that you're never going to be told to go and read the manual, right? It's always going to say, "Yeah, sure, that's great." But the bad thing is, you're never going to go and read the manual. That's the problem, right? But what I said at the end of it and I don't know whether this resonates at all, but I said now that I'm becoming aware that this is a problem, the paradox that I got into Emacs for the community and yet, in a way, I'm being moved away from the community. Increasingly, now, I will ask not "write this code for me" but "explain to me why this code doesn't work" or "explain to me why my problem could be done differently," and even more than that, not even "explain to me this" but "suggest to me how I could post this on a forum." I'm a bit worried about posting on a forum in case someone turns around and says, that's stupid. Claude or someone can say, if you write it like that, some people might find it interesting. Does that feel like a different kind of use of AI maybe?

Sacha: It does, and I encourage the more reflective use of it. For example, you might say, instead of generating this code, you might say, can you help me figure out what it is that I actually want to have in my workflow? Can you ask me questions to help me figure out how to do this or how to break it down into smaller tasks? Then that might be a more useful way of doing it. Sometimes people respond better when something is asking them questions. That is possibly an interesting use of AI.

Matei: Amazing. Sacha, thank you so much for your time.

Future conversations

Matei: Having had this conversation, do you think there's matter here for some kind of live stream or something, maybe with other people who want to talk about this stuff?

Sacha: In fact, if you wanted to take this recording and plop it somewhere public, I am totally fine with that. Learning out loud is how we have these conversations grow, right? The conversation is like this brain dump of ideas, and if we want to start unpacking those ideas and exploring them through all the multifaceted perspectives that we have in the Emacs community, other anthropologists or people who are interested in the philosophy of it, there's people who have so much deep experience in things that I have no idea. I would love for them to be able to say, let's take this facet of this conversation and build on it and explore that one. I am totally okay with both sharing this conversation, if you want to, as well as having other conversations that other people might be able to ripple out from.

Matei: Fantastic. I mentioned to Protesilaos that we're going to have this chat, and he said, you know, if you want to at some point organize a discussion over this kind of stuff, he'd be very happy to be involved.

Sacha: I've been experimenting with making myself ask people for help. Prot has coaching sessions. If our schedules can line up, then I can schedule a three-way conversation. It can be live and we can build on the ideas that you might have or follow-up questions that you might have, and then we can see if other people do as well. So that could be good. I'm looking forward to hearing about your insights. I would love to see where this goes. I think the Emacs community is definitely worth studying. I think that there are insights here that you might not otherwise come across in more specialized, more focused... Like, just developers or whatever, or more focused on closed source. There's something interesting about this mix of Emacs and AI and plain text and all that stuff. I would love to see where this goes.

Matei: Amazing. Thank you very much.

Sacha: All right. Bye.

Matei: Bye.

If you want to chat about Emacs and AI, you can e-mail Matei or check out Matei Candea | Anthropology.

View Org source for this post

Emacs Carnival May 2026 wrap-up: "May I recommend..."

Posted: - Modified: | emacs, community
  • : Fixed link to "May I recommend using your thumbs". Thanks, Gavin!
  • : Thanks to everyone who participated! I've included the links below.

It's May and I like puns, so I'm going to suggest "May I recommend…" as our Emacs Carnival theme this month, building on lively conversations about people's favourite packages on lobste.rs, Reddit, and Hacker News. Let's go beyond packages and talk workflows, tips, practices, perspectives… whatever you'd recommend!

It was pretty nice having a wiki page that people could edit without needing to wait for me, so if you write about this topic, feel free to edit the wiki page and add your link. If you run into problems doing that, please e-mail me and I can add the link for you.

People have already started sharing their recommendations:

(Still got ideas, just a bit late? Let me know and I can add it here as well as to Emacs News!)

View Org source for this post

2026-06-01 Emacs news

| emacs, emacs-news

There were 17 posts in the in the May carnival topic "May I recommend", very cool! Looking for something to write about next? Check out the June theme Underappreciated Emacs Built-ins hosted by Ross A. Baker.

Links from reddit.com/r/emacs, r/orgmode, r/spacemacs, Mastodon #emacs, Bluesky #emacs, Hacker News, lobste.rs, programming.dev, lemmy.world, lemmy.ml, planet.emacslife.com, YouTube, the Emacs NEWS file, Emacs Calendar, and emacs-devel. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at sacha@sachachua.com. Thank you!

View Org source for this post

La semaine du 18 au 24 mai

| french

lundi 18

Je me suis réveillée très tôt pour interroger ma sœur qui est très malade d'un cancer. Nous voulons enregistrer des vidéos pour ses jeunes filles et son mari. Sa fille aînée a commencé à l'interviewer, mais bien sûr, il y a des sujets dont elles ne peuvent peut-être pas parler pour le moment. Je l'ai appelée sur Facebook Messenger et j'ai utilisé OBS pour enregistrer l'appel. J'ai un flux de travail pour corriger et formater la transcription, et je suis ravie de l'utiliser pour ma famille.

Il faisait très chaud. C'était notre première vague de chaleur intense cette année. J'ai emmené ma fille au parc Amos Waites pour jouer à la pataugeoire là-bas. Elle a vraiment aimé la robe-maillot que nous avons cousue. Elle adorait tourner dans le siège pivotant que notre parc à proximité n'a pas. Elle a tellement joué qu'elle s'est endormie sur le chemin du retour.

Après le dîner, ma fille et moi sommes allées à un autre parc pour regarder des feux d'artifice pour la fête de la Reine. Il y avait beaucoup de gens, donc je pense que c'était un rassemblement habituel pour les jours de fête où les feux d'artifice sont autorisés.

J'ai terminé la révision de la transcription de ma conversation avec Prot et Philip. Je pense que l'audio de Philip est parfois trop faible, mais je ne suis pas sûre de pouvoir normaliser juste ces segments. Si j'ai une conversation avec un autre locuteur, je peux enregistrer les flux audio séparément, mais dans une conversation entre trois locuteurs (Prot, Philip et moi), je ne peux pas complètement les séparer. En plus, je pense que je ne peux pas remplacer juste l'audio d'une vidéo en diffusion sur YouTube. Peut-être que je peux mettre en ligne une nouvelle vidéo et changer l'ancienne vidéo en une vidéo non répertoriée.

À l'heure du coucher, ma fille et moi avons parlé de la neurodivergence, des mathématiques, et des facteurs humains comme les limitations de la boucle auditive comparée à la visualisation. J'adore lui parler de son cerveau.

mardi 19

J'ai essayé de virer de l'argent aux Philippines via Wise. C'était réussi.

Je me suis entraînée aux virelangues. Oups, j'ai oublié de confirmer l'audio sur OBS, donc je ne peux pas l'analyser.

J'ai réécrit deux transcriptions pour les entretiens de ma sœur.

J'ai emmené ma fille au parc pour jouer avec ses amies. J'ai oublié les glaces à l'eau, donc je suis revenue à la maison pour les retrouver.

Nous avons pratiqué les permutations et la division posée.

mercredi 20

J'ai réécrit encore des transcriptions pour les entretiens de mes nièces avec ma sœur. J'ai configuré un serveur dans notre réseau pour les héberger avec l'authentification basique.

L'école avait un remplaçant aujourd'hui. Il a accidentellement éjecté tous les élèves de la salle de réunion virtuelle et tous ont dû attendre que l'enseignant corrige les permissions.

J'ai ajouté un gousset aux shorts de bain de ma fille.

J'ai emmené ma fille et son amie au parc pour jouer. Elles se sont amusées à me donner des décharges avec l'électricité statique. Après que les autres amies de ma fille sont arrivées, ma fille semblait un peu surstimulée. Elle est partie seule et elle était grincheuse pour le reste de la journée, pauvre chérie.

jeudi 21

J'ai discuté d'Emacs avec Raymond Zeitler sur une diffusion en direct. C'était la première fois que je lui parlais en vidéo même si nous correspondons depuis 18 ans via les commentaires sur mon blog.

Le dentiste a fait deux plombages. Il a proposé un plan de traitement, mais c'est cher, donc je veux bien y réfléchir avant de procéder. Je pense que je veux gagner en confiance avec ce dentiste d'abord. On dirait que la restauration précoce est mieux que d'attendre pour les dents cariées selon les recherches, donc c'est bon, mais on dirait aussi que d'autres dentistes recommandent d'autres niveaux de traitement. J'aime les précautions COVID que ce dentiste prend. Il y a d'autres dentistes (un peu loin) qui prennent aussi ce niveau de précautions, mais ils disent probablement la même recommandation (c'est la même recherche), donc je ne cherche pas particulièrement d'autre conseil. Je ne veux pas passer pour une vache à lait, tu sais?

vendredi 22

Je me suis réveillée tôt pour une conversation sur la communauté Emacs et l'IA avec Matei Candea, un anthropologue. Il pense à faire une étude ethnographique, et je pense que c'est potentiellement intéressant.

J'ai terminé la transcription de ma conversation avec Raymond Zeitler sur Emacs. J'ai remarqué que j'utilisais le mauvais horodatage pour publier les chapitres à partir de la transcription, donc j'ai corrigé l'erreur.

Ma fille n'a pas voulu participer à l'école parce qu'il y a eu un remplaçant, donc elle a fait une pause.

J'étais fatiguée, donc j'ai fait une sieste.

J'ai emmené ma fille au cours de rattrapage de gymnastique. Elle a pris plaisir à apprendre la gymnastique aérienne. Après le cours, ma fille a voulu aller au parc asperge (St. James Park) parce qu'il y a un grand toboggan. Elle s'est entraînée à descendre le toboggan à de nombreuses reprises. Après avoir fait ça, nous avons acheté du sushi. Elle a essayé la tempura de crevettes et elle l'a aimée.

samedi 23

Il a beaucoup plu et c'était très venteux, donc nous sommes restées à la maison au lieu d'aller à la célébration de printemps à la ferme Riverdale.

Ma fille et moi avons joué à Stardew Valley avec le mod Tileman Reworked, qui me demande d'acheter les tuiles auxquelles je veux accéder. J'aime parfois jouer à des jeux avec des limites comme Minecraft Skyblock parce que les limites focalisent l'attention et la progression est très différente. Ma fille préfère notre jeu précédent avec le mod Stardew Valley Expanded.

Pour le dîner, nous avons mangé du sotanghon, qui est une soupe aux nouilles et au poulet. Nous avons aussi essayé le taiyaki congelé. C'était pratique et acceptable, mais bien sûr le taiyaki chez Pat Mart est meilleur.

À l'heure du coucher, ma fille et moi avons discuté de la neurodivergence, de la double exceptionnalité, de l'apprentissage des élèves doués, de la différence entre la récupération d'information et de la synthèse. Nous avons aussi discuté de la faune, des maladies, des vaccins, et d'autres sujets.

dimanche 24

J'ai parlé avec mon mari du TDAH. Il pense que je suis juste préoccupée, et ce n'est pas grave. C'est bon. Je ne veux pas laisser ma vie être perturbée au point d'avoir des problèmes dans deux zones ou plus dans ma vie pour obtenir possiblement un diagnostic, ce qui ne m'aiderait probablement pas beaucoup plus. Quand même, je peux continuer d'explorer comment je peux m'adapter à mon cerveau et ma situation.

Ma fille et moi avons préparé du lait au sucre brun et aux perles boba faites à la main.

Mon mari, ma fille et moi sommes allés aux Stockyards pour faire des courses. Nous avons acheté une boîte de mangues, des perles boba, des haricots azuki, et d'autres aliments. Nous avons préparé une fournée de mochis aux haricots azuki.

J'ai recherché quelques dessins pour les transcriptions. Je pense que je veux inclure les noms des interlocuteurs dans la marge gauche et les horodatages dans la marge droite. Je veux aussi réécrire la transcription pour supprimer les mots de remplissage.

Pour le dîner, nous avons mangé du curry japonais.

Je me suis couchée tard parce que sur Stardew, j'ai finalement accédé à la caisse chez Pierre pour acheter des graines dans la troisième année. La progression est très lente. Heureusement, le mod HibernationRedux me permet de sauter le temps pendant que j'attendais la croissance des arbres.

View Org source for this post

Karthik's notes on Emacs Chat 24: Omar Antolin Camarena

| emacs

Here's a guest post from Karthik Chikmagalur in response to Emacs Chat 24: Omar Antolin Camarena.

  • 16:00 - Omar's embark-on-last-message is gold! I implemented it and have already used it a dozen times in an hour.
  • 17:00 - Omar mentions his tmp package for creating throwaway buffers. I use the scratch package for this. M-x scratch will open up a scratch buffer. If you had a region selected, that will be copied to the scratch buffer. By default, it will use the same major mode as the buffer you calling it from. Calling M-x scratch with a prefix arg will let you pick the major mode you want.

    I have some additional customizations to try to automagically pick a major mode based on what I have selected: https://github.com/karthink/.emacs.d/blob/3deed38c0e02e95fdfab6812c494b1736b945a1e/lisp/utilities.el#L36

    Also related is the edit-indirect package, which I'm sure you're aware of. I think of it as scratch's dual: scratch is for when I want to edit something without regard to its provenance, edit-indirect is for editing the source (exactly like org-edit-special).

    I also try to automagically guess which major mode a piece of text should be edited in. edit-indirect edits something that looks like a lisp form in lisp-interaction-mode, even if the origin is (say) this email composition buffer: https://github.com/karthink/.emacs.d/blob/3deed38c0e02e95fdfab6812c494b1736b945a1e/lisp/utilities.el#L67

  • 21:20 - You mention that you sometimes want to insert something into the minibuffer when you're in the minibuffer, but you end up inserting into the main buffer instead. Omar agreed that there is no easy fix for this.

    Omar, Daniel Mendler and I actually discussed this years ago and came up with a separate command to do this:

    (defun minibuffer-replace-input (&optional arg)
      "Replace original minibuffer input.
    
    When a recursive minibuffer is active, insert the current string
    into the original minibuffer input.  With prefix ARG, replace it
    instead."
      (interactive "P")
      (when (and (minibufferp) (> (minibuffer-depth) 1))
        (let* ((replacement (minibuffer-contents)))
          (unwind-protect (minibuffer-quit-recursive-edit)
            (run-at-time 0 nil
                         (lambda (rep)
                           (when arg (delete-minibuffer-contents))
                           (insert rep)
                           (pulse-momentary-highlight-one-line))
                         replacement)))))
    

    I don't need it every day, but when I do it's very handy.

  • 29:40 - Omar mentions that he prefers to have lots of commands to mark specific text objects instead of hammering expand-region (or expreg-expand). There is a (now) old package called easy-kill which does this, allowing you to define marking commands for different objects at point (e.g. s for sexp, w for word, l for line, d for defun etc). It's easy to add support for more objects because I think it integrates with thing-at-point. The marking command provided by this package is actually called easy-mark.

    But easy-kill / easy-mark is actually the best of both marking styles, because you can use SPC to cycle between marking all the different text objects at point. I've further integrated this with expand-region so that at any point in the easy-kill mark process I can expand the region as well: https://github.com/karthink/.emacs.d/blob/3deed38c0e02e95fdfab6812c494b1736b945a1e/lisp/setup-editing-extra.el#L250

  • 36:00 - Didn't know Omar is the reason vertico-grid-mode exists. That's fortunate, I use it all the time!
  • 44:00 - Omar's point about improving ffap to improve Embark's default action on files is great, really speaks to my sensibilities about composing features in Emacs in a way that provides multiplicative benefits.
  • 48:00 - NOPE! I use CANCELLED as a TODO kwd in Org, but the fact that it's not 4 letters long has bothered me forever. NOPE is much better.
  • 58:30 - Re: Omar's toggle map: this is something I think many users end up writing? Mine is a transient map: toggle-modes-transient.png that grows extra columns in specific major-modes: toggle-modes-full-transient.png

    But I appreciate that Omar uses a regular keymap instead of a visual menu, that's the Embark way. Transient menus are frustratingly non-composable with other Emacs features.

  • 1:00:00 - isearch-delete-wrong is actually built-into ISearch? Pressing C-g once should delete the non-matching part. It's possible he's customized C-g to quit Isearch right away.
  • 1:07:30 - I didn't understand Omar's practice of using embark-dwim to preview the result of any minibuffer command, like org-ql-find. Is this something you were able to reproduce?
    • I've been using dot-mode for almost as long as Emacs, to the point where I've often made the mistake of assuming it was an included feature. It uses simple heuristics, but works surprisingly well at capturing your intent on what the "bounds of an edit" should be in Emacs.
    • Omar mentioned that he stopped using multiple-cursors because the immediate feedback from all cursors inspired false confidence, as off-screen cursors could do something unexpected. I use a personal fork of a package called macrursors that's somewhere in between multiple-cursors and keyboard macros:

      https://github.com/corytertel/macrursors Fork: https://github.com/karthink/macrursors

      It's inspired by both multiple-cursors and meow's beacon-mode. It places cursors at the locations where the keyboard macro will be executed, but executes the full keyboard macro at each location at once, without immediate updates. This addresses the "false confidence" issue, but it does three other things that are very handy:

      • You can bound the region inside which cursors should be placed. The scope can be the paragraph, like in Omar's example, but also any other text object (defun, line etc), and you can cycle between the scopes or expand it with expand-region.
      • You can place cursors from most common actions, like at ISearch or Avy candidates (selectively or all at once), or at all text objects of a certain type inside the bounds.
      • You can "narrow" the buffer to only the cursor locations, fitting and verifying more of them on screen. When the macro runs, the selective display in the buffer persists for a second so you can scan the results:

        https://share.karthinks.com/macrursors-isearch-hideshow-demo.mp4

        Steps:

        1. Start ISearch and search for cl-defmethod
        2. Create cursors from all ISearch matches
        3. Selectively display only the cursors
        4. Show more context around the cursors
        5. Make a change (involving a kmacro counter)
        6. Finish. (The selective display persists for a second.)
        7. Examine the changes.

      It uses undo amalgamation by default so you can undo all the cursor changes except the original one in one step. Of course, your changes are stored in the kmacro ring so you can now apply them as regular keyboard macros too.

      Most of these features are probably present in multiple-cursors at this point, although I'm not sure about bounding cursor ranges with macrursors-select. But this has replaced the usual keyboard macro workflow for me, and not many people are aware of macrursors so I thought I'd mention it.

Thanks to Karthik for his notes! If you have any comments, please feel free to email him.

View Org source for this post

Emacs Chat 24: Omar Antolin Camarena

Posted: - Modified: | emacs, emacs-chat-podcast, emacs-chat

: Updated transcript and added a link to Karthik's notes.

I chatted with Omar Antolín Camarena about Emacs, keyboard macros, temporary buffers, Embark, and other workflow tips.

View in the Internet Archive, read the transcript online, watch or comment on YouTube, download the audio or the transcript, or e-mail me.

Related links:

You can add the iCal for upcoming Emacs Chat episodes to your calendar. https://sachachua.com/topic/emacs-chat/upcoming-emacs-chats.ics

Find more Emacs Chats or join the fun: https://sachachua.com/emacs-chat

Chapters

  • 0:00 Ignore this part
  • 0:18 Opening
  • 0:46 How did you get into Emacs in the first place?
  • 6:01 Repeating edits
  • 7:28 dot-mode: repeating commands
  • 9:24 block-undo: undo things as a chunk
  • 10:29 Starting and stopping keyboard macros
  • 12:15 Keycast and Embark
  • 13:33 apply-macro-to-lines-of-paragraph
  • 16:34 embark-on-last-message
  • 18:06 tmp-buffer with a major mode
  • 19:26 placeholder
  • 20:38 enable-recursive-minibuffers
  • 22:57 Overriding embark-select
  • 23:32 quick-calc
  • 26:30 Multiple cursors
  • 27:40 Block-undo and regular undo
  • 28:53 Cycling through Embark targets
  • 31:39 Imenu for navigation
  • 32:51 Collaboration
  • 38:01 Technology adoption and Emacs packages
  • 40:06 Personal packages and naming conventions
  • 42:26 find-file-at-point and directory names
  • 43:49 The value of using Emacs’s APIs
  • 44:56 org-ql and usual files
  • 47:06 Shortcuts for org-ql search syntax
  • 47:43 Org TODO states: TODO, WAIT, DONE, NOPE
  • 48:26 The inserter macro
  • 50:05 luggage: generative art experiments
  • 53:49 Teaching and Emacs
  • 54:53 The print10 generator
  • 56:23 arXiv
  • 58:29 Toggle keymap
  • 1:00:54 isearch-delete-wrong
  • 1:03:14 isearch - continue from the beginning of the match
  • 1:05:12 Using keymaps to remember sets of commands
  • 1:06:04 Other things from the config

Transcript

Expand this to see the transcript and screenshots

0:00 Ignore this part

Sacha: Cut off at, you know, roughly an hour and seven minutes from now. She's going to come out and have lunch. Okay. All right. Going live. Alright folks, we are here a little bit early.

0:18 Opening

Sacha: This is Emacs Chat 24 with Omar Antolin Camarena, whom we know from Embark and Orderless and a lot of other little packages that I personally use on a daily basis. I'm very much looking forward to this conversation.

Omar: Yeah, so am I. Very excited.

Sacha: Of course, before we dive into all these lovely details, tell us a little bit more about your context. You're a researcher at the Mathematics Institute. I can see why Emacs would be a great fit for that.

0:46 How did you get into Emacs in the first place?

Sacha: How did you get into Emacs in the first place?

Omar: I think it's just by virtue of being old. When I started out looking for a text editor, there were not that many great options. When I was a teenager, 30 years ago, I decided to install Linux because I heard about it. That was the era where you went to a newsstand and you bought a Linux magazine that came with a CD, and I installed Linux from that. I think it was Slackware, maybe. I was already a hobby computer programmer. I've been learning programming languages since I was a child, when my father gave me my first computer. I think that was the main reason I switched to Linux. I noticed that people wrote many more interpreters and compilers for Linux than for Windows. That's why I wanted to use Linux. I needed a text editor that handled all sorts of weird programming languages. I was looking for a general purpose one, not an IDE. I used IDEs, younger ones, like Turbo Pascal. Probably that was the main one. I loved that. It was great. I went through the Linux distro, tried a bunch of editors. I settled on Emacs and Emacs-like editors. I tried Jove, which stands for Jonathan's Own Version of Emacs. And there was also an editor called... Oh, I forget. There was one that had its own extension language called S-Lang. I used that for a while. A little later, I remember using Slava Pestov's jEdit. I really like that, too, although Java is not that fun to write extensions in. I was looking for an editor and I wanted it to be extensible, which is funny because I hardly ever extend it. I just wanted there to be the option. I used Emacs for a long time. But when I got serious at being efficient at text-editing, I actually switched to Vim. I switched back to Emacs many years later because of one very specific problem in Vim. The syntax highlighting for LaTeX files is pretty slow. On a normal computer, you won't notice that it's slow. But I had a little netbook that was like 10 years old when I had it. I took it to class to take notes in math courses. I was writing in LaTeX Live with a bunch of macros to insert things. The syntax highlighting meant that Vim lagged behind my typing. I'm not that fast of a typist, so it was problematic. The Vim manual has an entire section on what to do if text highlighting is slow. You can look for it with Vim :help tex-slow That pops up the right section of the manual. I tried everything that it said there and they all made it slightly faster, but none of them really solved the lag, other than turning off syntax highlighting. I turned off syntax highlighting and took notes for like half a semester, and then I decided to try Emacs on that old netbook. Its syntax highlighting was perfectly snappy. This is just a weird thing in Vim that specifically LaTeX syntax highlighting is slow. I never noticed it being slow in any other... I don't know what Vim calls them, what Emacs would call a major mode. It was only ever slow in LaTeX, but that was enough to get me to try Emacs. But by then in Vim, I had learned that you want very granular motion commands to move by word or by sentence, and you want to be able to be placed at the end of the word or at the beginning of the word. All of these higher-level editing constructs that Vim really pushes you toward. In Emacs, I hadn't done any of that before. I moved around with the arrow keys. But when I came back to Emacs after having been in Vim, then I wanted to get serious about editing efficiently in Emacs. I think I actually like it better than Vim now. But yeah, that's why I switched back to Emacs. It's just this quirk that LaTeX syntax highlighting is slow in Vim.

Sacha: Well, their loss. So you tried a whole bunch of other editors. You got into Vim because you wanted to be more efficient. Getting deeply into Vim was great, but you ran into that bug. So you switched to Emacs because it was more efficient, more performant. All that experience with Vim has made you a better Emacs user because now you're like, okay, you appreciate all the navigation and movement. And you were telling me over email...

Omar: Things I missed from Vim.

Sacha: Yeah, You were telling me over email how the kind of the keyboard macros that you got used to in Vim, you've translated some of that over to Emacs and how you use them. We definitely want to get into that.

Omar: Keyboard macro-like things. In Emacs, for a while, I used multiple-cursors. I liked it a lot.

6:01 Repeating edits

Omar: One thing I really missed from Vim is the dot command that repeats the last edit. But in Vim, edits are composite things. You have a command to change a sentence, for example. That will delete the current sentence, put you into insert mode, let you type a new sentence, and when you press escape, that concludes the edit. The whole edit is the operation of deleting the current sentence and replacing it with the specific thing you typed. That is a thing you can repeat. The repeatable edit commands in Vim are much coarser and more conceptually appropriate units than in Emacs. The repeat command repeats the last Emacs command, but everything runs a command in Emacs. You can repeat inserting the last character. That's not very useful. You want to repeat at least the whole consecutive stretch of characters you inserted. Undo in Emacs does do that. Undo coalesces. If you type a bunch of characters and you undo, it doesn't undo them one by one. It undoes them. It clumps them depending on pauses between your typing. That's fine. I want that sort of coarseness. I don't want to undo every single step at a time. Similarly, when you repeat things, you don't want to repeat every single step. I think Vim has like a pretty good unit of things you can repeat. I was missing that in Emacs.

7:28 dot-mode: repeating commands

Omar: There's a package called dot-mode which I used to use and I like a lot. I'm not exactly sure why I stopped using it. So this gives you a more Vim-like experience for repeating commands in Emacs and what it does is that it watches you as you type and it constantly makes a keyboard macro out of the last consecutive stretch of buffer modifying commands. So, for example, in Vim, if you want to change a word, there is a change word command, and you type c w, and then you change the word, and then that thing gets repeated. In Emacs, to change a word, it's not a single unit, right? You delete the word, and then you type in something new, and each character you type is running insert-char. dot-mode will coalesce all of that into a single keyboard macro that you can repeat, right? If you do some motion command that doesn't modify the buffer, and then you delete a word and type a new word, everything from the deletion to the end of the typing would be what dot mode repeats. The experience is actually very similar to using dot in Vim. In my opinion, a little bit better, because in Vim, I often had this problem. It gets you into this competitive video game mentality. How do I do the edit in a single repeatable command? I want to be able to use dot to do this again. So that you have to think ahead. It's kind of distracting. Of course, if a sensible person would not get caught up in that, it would just... do the edit whichever way they can, but I wanted to maximize the repeatability. dot-mode lets you be a little bit more relaxed. It still catches all of the thing that should have been a single edit. So yeah, I like it a lot.

Sacha: So that's dot-mode.

9:24 block-undo: undo things as a chunk

image from video 01:06:05.633Sacha: You also mentioned block-undo.

Omar: That is a package of mine I can show you. That's the entire package. It just uses this with-undo-amalgamate command. Whatever you run inside with-undo-amalgamate undoes in a single step. I use it for executions of keyboard macros. A keyboard macro, if you run it all over the place, if you apply it to every line in a region, or you just repeat it a hundred times, that is a lot of tiny individual edits. If you undo that, you do not want to undo them one by one. This just makes them all undo in a single step, which is what Vim does, actually. This is one of the things that I said, no, Vim has this right. I need this in Emacs.

Sacha: Okay, that makes sense. So dot-mode is more like implicit keyboard macro boundary definitions. This one is like the undo-ness of it.

10:29 Starting and stopping keyboard macros

image from video 00:11:29.533Sacha: I saw in your config, you also have more convenient shortcuts for starting and stopping keyboard macros. It's like a modifier and the keystroke instead of two or like function keys, which are further away. I'm guessing you use keyboard macros a lot.

Omar: Yeah, I do. When I got rid of dot-mode, it was an experiment to see if I could just remember to record keyboard macros. The thing that the dot-mode or the dot command in Vim solves is that you don't always have the foresight to record a keyboard macro. Sometimes you realize, oh, I need to do the same at some other places, but you didn't record it ahead of time. Then you wind up doing it once, realizing you need to do it a bunch of times, then recording the macro, then doing it again. I wanted to see if I could remember to record macros. I decided that I needed to make it as as frictionless as possible. This is the command that is bound by default to F3. I like it better than the thing that's bound to C-x ( because this kmacro-start-macro-or-insert-counter does both things. It could start a recording, or if you are recording, it will insert the keyboard macro counter.

Sacha: For folks who are like, what? Macros? Counters? Yes, you can have your keyboard macro automatically add one to a number, for example. There you go.

image from video 00:12:10.867Sacha: Hello, hello, hello.

12:15 Keycast and Embark

image from video 00:16:44.033Omar: I also activated keycast. I hope people can follow along. I have some small modifications to make embark transparent to keycast. If I use embark, you see embark-act, but then you also see what command I call.

Sacha: I just stole that from your config. I wasn't entirely sure if I was using it correctly, but it definitely looked like something interesting and useful.

Omar: If you don't use that change, then keycast doesn't see through embark and you don't get which actions you called.

Sacha: Yeah, the opacity of some of these kind of key binding niceties... they hide a lot of stuff from the standard Emacs ways of doing things. That's one of the criticisms of transient and other tools. I'm glad that you're finding these ways to make these packages work well with other packages.

Omar: I think this was by request. Somebody requested it. Maybe it was Prot. It's definitely a good idea. The code for that is on the Embark Wiki as well.

13:33 apply-macro-to-lines-of-paragraph

Sacha: The other thing that I wanted to point out that you make a convenient keyboard shortcut for in terms of keyboard macros is apply-macro-to-lines-of-paragraph, which I personally had not been using until I saw your config. And I was like, that is a thing.

Omar: Yeah. Well, that's a command that I wrote. It’s a wrapper around apply-macro-to-region-lines, but it automatically uses the paragraph. That way you don't need to select it. I find that extremely convenient. What would be a good example of that? You want to wrap something. What should I do as an example of this? For some reason, I needed to convert these things to, say, unwrap the parentheses and turn them into an Org Mode table.

Sacha: Yeah, that makes sense.

Omar: I just apply it to the rest of the paragraph.

Sacha: Magic. That's great, because I would normally just start executing the macro and hope I remember to stop at the end, but then I overshoot, and then I have to undo, j and then it's a mess.

Omar: Or you could select the paragraph and then just use the built-in apply-macro-to-lines-in-region.

Sacha: Yes, yes, that's a possibility.

Omar: It just saves you the step of marking the paragraph. I found that I most often when I used apply macro to lines in region, the region was exactly a paragraph. So I figured like there's no point in...

Sacha: All right, all right.

Omar: It's undone in a single step. Like the application. The thing I recorded as a macro, that is not coalesced. Yes, of course.

Sacha: Because that's the actual recording of it. Charlie Baker in the chat says, "Definitely going to add the keycast transparency to my config. I've been wanting that for a while." These little demos of like, oh, this is what this thing in your config does. It's very helpful for people to be able to see its awesomeness.

Omar: Where is that?

Sacha: One of the other interesting things you mentioned was your placeholder package. I can see how the keyword macros help you with text that's already there. Then you've got these placeholders for informal snippets or quick snippets. Show us that. You use it a lot.

Omar: Yeah, I do. Oh, that tmp-buffer is a command I have for popping up temporary buffers in specific major modes. Maybe I can quickly show that first. Yeah, yeah, yeah. So let's see. Oh, yeah. So let me...

16:34 embark-on-last-message

Omar: There I used another little command I have. embark-on-last-message It just calls Embark on the last thing in the messages buffer. Often I want to act on the thing that is the last word in the echo area, so that's what this does.

Sacha: Okay.

Omar: The last thing in the echo area was this symbol embark-on-last-message so I can act on it directly.

Sacha: Which is brilliant because I keep switching to the messages buffer to try to copy something, and by the time I switch, sometimes there are other messages, so it's great to just be able to do something.

Omar: If there are other messages, then I also switch to the messages buffer, but if I want to act on the very last thing, I have that command for it.

Sacha: Yeah. I'm saying this is faster, so I get the chance of just hitting the shortcut before another timer goes in and messes around with my messages. So yes, shortcuts. Okay, temp buffer. Tell us about that.

Omar: You can configure single... Wait, where am I? Transcribing job. I ran Whisper by accident.

Sacha: Which is another thing I wanted to check. Many things I want to talk to you about…

Omar: The idea of using Whisper, I stole from you using it to dictate. I thought, oh, this looks convenient if the model is good. I tried it and it is very good.

18:06 tmp-buffer with a major mode

image from video 00:18:10.233Sacha: Temp buffer.

Omar: Different major modes. It has a customizable list of bindings for specific major modes.

image from video 00:18:19.533Omar: It also has an option to just prompt you for a major mode. It pops up a temp buffer in whatever major mode you chose. I use it all the time to make new scratch buffers.

Sacha: Yeah, I can see that's useful. I switch to a buffer that's got a name that doesn't exist yet, and then I have to press more keys to get to the major mode.

Omar: But if you're doing certain things, just type random letters to make a new buffer, this is much better. They might as well all be called temp.

Sacha: Do you reuse the buffers, or it's always just the one buffer?

Omar: New buffer, then I kill it.

Sacha: Very temporary. Gotcha.

Omar: By the way, kill-current-buffer doesn’t have a default key binding. I don't understand why not. OK. I bind it to C-c C-k, which normally, I think, is kill-buffer, but why would you want to kill a buffer that's not the one you're looking at? Wait, what was I going to show you?

Sacha: You were going to show me placeholders.

Omar: Right.

19:26 placeholder

image from video 00:19:42.100Omar: I often need to send several similar email messages. I'm going to invite you on some day of some month to give a talk, etc. That's the body of an email. I'll write it once. Here I’m using placeholder-insert to insert this symbol. It appears in green, but it doesn't matter. It's just text. You could type that symbol yourself.

image from video 00:20:05.633Omar: Then the placeholder-next and -previous commands will cycle among those and let you fill each one in. You don't have to fill it in right now. If you repeat the command, it restores the placeholder and moves you to the next location.

Sacha: That's one of the things I liked about the implementation compared to yasnippet, because yasnippet, you’ve got to actually remember to fill in the fields before you move on to something else. If you get out of it, you can't tab to the next field. The placeholders will let you go and come back and look up some information and put that in and so forth.

20:38 enable-recursive-minibuffers

Omar: Yeah, there's lots of things I loved about Vim, but one thing I grew to strongly dislike is modal computer programs. Not just modal editing, modal anything. I don't like being forced to finish what I started. I want to be able to get distracted and go off and do something else. For example, in Emacs, I very much dislike the default value of enable-recursive-minibuffers. The default value is nil. They don't let you use the minibuffer if you're already using the minibuffer. Emacs is supposed to be about freedom. Why is that the default value? So I set it to t, which is more sensible. That way you're not stuck in the minibuffer.

Sacha: Actually, one of the things that I've been trying to figure out is when I'm in a minibuffer, sometimes I want to use Embark to insert something into the minibuffer, but then I end up inserting it into the buffer buffer.

Omar: Yeah, there's no... Embark doesn't have any solution to that problem. It doesn't always do that. It does that if you're in the minibuffer in a completion session. If you're in the minibuffer in a non-completion session, then it acts as a regular buffer. So if you're in eval and here you had... You can use embark-insert in the usual way to duplicate stuff.

Sacha: I have a workaround. I just use kill. I copy the text instead of inserting it and that works out fine.

Omar: Yeah, I do too. The behavior of inserting into the previous buffer is so useful that I don't think I would want to change that. But yeah, it is unfortunate that for that specific instance, you can't use insert.

Sacha: I appreciate that Embark allows us to have all of these key bindings that we can do stuff with. I noticed in your config, in addition to Embark, you also modify a lot of the standard key maps to add other shortcuts to rebind things that make sense to you. Key bindings are something that a lot of people struggle with, trying to figure out more places to put more shortcuts that make sense. What are the key shortcuts that work really well for you?

22:57 Overriding embark-select

image from video 00:23:18.367Omar: One thing I don't like about the default Embark configuration is that SPC is used for embark-select, which marks a target for later use. I hardly ever use embark-select, so I would rather SPCbe for marking the region, which is something I do pretty often, and have embark-select on C-SPC, which is not a command I use very often. I swapped those. I think most of this is just adding new actions that feel specific to me.

23:32 quick-calc

image from video 00:24:05.733Omar: quick-calc is the thing usually found to C-x *calc-dispatch is the command. It’s C-x * q. That’s quick-calc. It's useful as an Embark action. If you have an expression and you... Wait, what am I doing wrong? I forgot what my binding to mark what Vim calls a word in capital letters, which means a consecutive stretch of non-space characters... If you mark this, I can act on it with =, get the result.

Sacha: And specifically this embark-region-map is what you can add in the selected region. Incidentally, I've been playing around with using the Selected package for this because it also gives you the key map.

Omar: Yeah, yeah. I love the Selected package and recommend it often. I don't use it myself just because the only thing it would save me is calling embark-act, because the commands I would put in the selected key map are exactly the commands I have in the embark-region-map. For me, Selected would only save me one keystroke, which is Embark Act, so I don't feel it's worth it, but it's a great idea. For example, I do use the rectangle keymap. Yes. So they're the only difference. It's equally good an idea as Selected is. The only difference is that the rectangle keymap comes with Emacs and Selected is an external package. I decided it's not worth installing an external package when I could just use Embark Act, which I do have to use because otherwise I won't understand people's bug reports. But the rectangle mode there, that one is built in, so I just found a bunch of useful stuff in it.

Sacha: Yeah, and I noticed you have also like you have a narrow-to-point so that you can use your rectangle commands to yank something into it, so I get the sense that you use rectangles a fair bit.

Omar: You've really read my configuration very carefully. This narrow-to-point is subtle. I am very impressed that you figured out the reason for it.

Sacha: I started digging through narrow-extras because I saw your narrow-or-widen-dwim and I said, yes, I need that in my life.

Omar: I don't think... I took it from somebody. Endless Parentheses, probably. The issue with narrow-to-point, the reason you need it, is that if you insert a rectangle somewhere, try to insert it in a blank line, and it'll overlap with what was after it. But if you first narrow to the point and then insert the rectangle and then widen again, it gets its own blank lines. That's the reason I have it.

26:30 Multiple cursors

Sacha: @zor_​org asks, was there a time you wanted multiple cursors? Have you ever been tempted?

Omar: Multiple cursors. I think it gave me a false sense of security which is why I experimented not using it and then the experiment just never stopped. The thing with multiple cursors... Multiple cursors are more interactive than keyboard macros, because if you can see several cursors on the screen, you can visually make sure that what you're doing does apply correctly at each of those locations. But then I started noticing that that made me feel very confident I was doing things the right way in multiple cursors, but there were some cursors offscreen where I wasn't paying attention to what was happening there, and then I got it wrong and was more confused. Just psychologically, a keyboard macro, since I know I don't see the other places where I'm going to run it, I'm more careful when I record the keyboard macro. It's a psychological trick I'm playing on myself. By using keyboard macros instead of multiple cursors, I force myself to pay more attention to what I'm doing.

27:40 Block-undo and regular undo

Sacha: Does the block undo still let you select a region in order to undo just the part that was within it, in case you notice offscreen that it's done something bad in just these entries?

Omar: Yeah, that's completely independent. That built-in Emacs behavior is not affected by undo boundaries.

Sacha: Wait, is it?

Omar: If it overlaps with part of... I don't know. Sorry, sorry. I don't know. So if I have a big change that I amalgamated into a single undo, and then I pick a region that overlaps partially with that but not completely, what would undo and region do? I don't know. I think it... I'm just guessing. I would just think that it sees that the affected region by the big block undo is not completely contained in the region and then it doesn't undo it.

Sacha: Okay, so I'm just going to conclude that you do not make mistakes with your keyboard macros.

Omar: I can easily undo them instead of having to keep running on undo. So it's not that I don't make mistakes, but that I try to fix them right after running the keyboard macro.

Sacha: All right, all right. I had another question.

28:53 Cycling through Embark targets

Sacha: Ou've got a lot of different Embark maps and you've got a lot of different Embark targets. How do you handle going through the different ones that are at the point? At the moment, I've got the label at the top and I just flip through it. I know sometimes I need to hit it twice or sometimes I need to hit embark-act three times for this kind of thing. How do you distinguish between lots of them when you're just going through it?

Omar: I think that's the poorest part of the user experience with Embark Act currently. I don't really like it, but I don't have a good alternative. A lot of people like expand-region and I don’t like it because I feel like I have to hammer it off. I prefer to have a lot of… This is another thing I learned from Vim: have a lot of commands to mark specific things and just memorize all of them. But expand-region says, no, don’t memorize that. Just hammer on expand-region until you get the thing you want. Ffor me, even though it's objectively fast, it just feels very slow. It feels like I have to hit it four times whenever I want to mark something. I get the same feeling from cycling in embark-act. I don't really like it. But if we had come up with a better alternative, and I say we because I discussed this in the GitHub issues with with Daniel Mendler and Prot, and I think @hmelman was also in those discussions, and maybe Clemens Radermacher? I just couldn't come up with a much better alternative, so I put up with it. I don't need to cycle that much. I almost always want to act on the first target. Which is unfair, because I decided what the first target is in the default configuration, so it's sort of tuned so that I hardly ever need to cycle. I apologize if it means other people need to cycle a lot.

Sacha: Nonsense. We can all modify our target list, so we can always tune it to what we want.

Omar: I mean, it's a lot of work, right? I think the default Embark configuration is over half of the source code of Embark. The configuration is... Where does that start? Oh, I wish the autoload cookies were not in the outline.

Sacha: If you do a space, oh, I guess it doesn't do that, right?

Omar: Oh, yeah. For orderless, I use the escapable spaces, so I can do that.

31:39 Imenu for navigation

Sacha: I should also point out that your config uses a lot of imenu also, which was another interesting thing I picked up.

Omar: Yeah, I like imenu, yeah. I should add imenu for this. One thing I did to imenu is I added a section for key maps.

Sacha: I saw that. You have a regular expression so you can see it easily.

Omar: Right. It's not half, but a big chunk of Embark is just the default configuration. It would be a lot of work to configure Embark from scratch. That's why the package comes with an extensive default configuration.

Sacha: Charlie Baker says, “I have embark-act set up to expand in the same way expand-region does, but with Embark’s type awareness, it's easy to add a contract function.” I guess maybe also some highlighting helps with that. Charlie also says, “I also have a completing read interface in the transient menu to jump directly to one of the many types under point that I'm seeking.” Charlie, you're going to share somewhere so I can steal that part of your config, right?

Omar: I mean, that would be something I would consider adding to Embark itself.

32:51 Collaboration

Sacha: You mentioned having all these conversations with Daniel and others through GitHub and other things. I wanted to touch on that because I think in the Emacs community, it's pretty rare to find people who are collaborating on packages and packages that work so well together. The partnership between your packages and Daniel Mendler or Minad's packages with Consult and Vertico and Marginalia is really nice. We don't see a lot of examples of that kind of inter-packaged conversation as much. How did that start?

Omar: I think it was mostly Daniel's initiative. I had started work on Orderless and Embark. I think his first package was Consult, maybe, of this family of packages. I remember Embark was a pretty sad shape when Daniel started raising issues on the Github. He really lit a fire under me to improve Embark. It started with him complaining about things in Embark, and I immediately realized that he was thinking very carefully about the user experience, so I thought he is full of good ideas and I should listen to them. Back then at the start of Embark and Orderless, Prot was also very involved in discussing the design. All of this is on GitHub issues. Some software archaeologists can find all of it. So I think we started working together when we realized we were both writing Marginalia, so we decided to merge those two packages into a single one. I think maybe the name Marginalia was suggested by Prot, I don't remember, but it's a very good name. The collaboration was completely unplanned. We just did it because we had already talked on the Embark issues and Daniel's suggestions improved Embark a great deal in a short amount of time. So then when we both realized we were writing something like Marginalia, we decided to just merge those two packages and write a single one. Since that worked out well, we kept on collaborating. So far, we haven't co-written any other package. One thing like that is that now Daniel is a co-maintainer of Orderless, which is great because Daniel is extremely efficient at fixing bugs. He does it instantly. He figures out what's wrong and has a patch in a few minutes after he looks at the issue. He looks at the issue the day it was posted or the day after. I can't do things that quickly. It's great that he's helping out with orderless. It wasn't planned. It just felt right from the very beginning. I immediately realized he had some great ideas and implemented a lot of them. Then we started doing that the other way around. I started commenting on a bunch of issues in Consult and Vertico. I think I exerted some pressure on Daniel to add features to Vertico, like the grid view and the horizontal view. Or maybe specifically the grid view, because at the time I was... I'm sort of slow to switch basic Emacs infrastructure. I wasn't using Vertico for a long time, even though I was like opining on the Github issues for Vertico, and the reason was that I was stuck with the vastly inferior embark-live. There was this embark-live thing where you could pop up a buffer with the targets in the minibuffer, which just means a completion candidate. So you could use Embark as a kind of completion user interface. It was very slow, but it was very featureful. You could do a vertical list. You could do a grid. In the list, you could activate zebra stripes. Yeah, you can see that's been removed from Embark. But I kept saying to Daniel, I'll switch to Vertico if you add a grid view. He eventually did add the grid view. I kept my word and switched to Vertico, which is much better than the thing in Embark. I was just being stubborn by not switching earlier. But if I had switched earlier, maybe Vertico wouldn't have a grid view.

Sacha: I think it's definitely a good example of a set of packages that has... So all this started in about 2020s or so. So we actually can see how people have gotten into using Vertico and all the other packages compared to, say, looking at more popular packages that have been around for a long time. "Of course everyone's been using Org Mode for a long time." It's there. It's part of the fabric.

38:01 Technology adoption and Emacs packages

Sacha: It's very interesting to see the technology adoption around it. A lot of the things that people struggle with as package authors is getting other people to try out their stuff. With Orderless and Embark probably in the early days, what was that like to put this thing out there in the world and have people start to try it? How did people find it?

Omar: I personally found it very scary. At the beginning, I still thought Embark was a part of my personal Emacs configuration that sort of grew out of control and I decided to publish separately. But then I have all these people telling me how to improve what I still thought of as part of my personal configuration. I think one thing that helped was that people made very good suggestions. So I realized, no, no, it's worth publishing reusable parts of your configuration just for the GitHub issues, just for people finding bugs and suggesting improvements and so on. But yeah, I had to adjust to having some users. At first, it was very few people. But then they got added to Doom. I think they were made the default in Doom. That was a huge influx of users. That was very scary. We were suddenly flooded with new bug reports, like all of the packages in the family. I remember feeling like there's a horde of Doom users running at us.

Sacha: All right. So, starter kit, then everybody gets into it, and then everybody starts talking about it because they're like, yeah, you know, it's great. You can specify things out of order. You don't have to remember what words come in, which order when you're completing things. Those of us who aren't on starter kits are like, yes, we should try that too. That's how it's done.

Omar: Doom helped a lot to raise awareness and adoption.

40:06 Personal packages and naming conventions

Sacha: You've got a lot of other small packages. For something as small as block-undo, which you showed us, it really just fits in one screen. Is that something that you would set up as a different repository or just as a file within your current one?

Omar: No, those are all in my user-lisp directory.

Sacha: I have actually successfully used use package to grab stuff out of your user-lisp directory and use them in my config. Yeah, it works. I just say, all right, my load path is here where I've checked out your source code. It defines these commands. Then I can bind your functions to my shortcuts. Although, because your functions are named the way that I would expect Emacs functions to be named, I've been defaliasing them so that I don't accidentally say, oh yeah, that's totally built in when it isn't.

Omar: Yeah, I'm inconsistent with these little packages in my user-lisp directory. In some of them, I do stick to the convention that the package name is a prefix for all the functions, and for some, I don't. For some, I just try to name them the way exactly what you said. Like, what would these be called if they were built into Emacs? Which means they don't share a consistent prefix often. I should probably make that more consistently use the package name as a prefix so that they're easier to dot.

Sacha: Or I have another suggestion. You could get apply-kmacro-to-paragraph or whatever that is into core Emacs. That would be great for everyone.

Omar: Yeah, maybe that one is useful enough. Some of these I don't use anymore because I think I've substituted them with workflows with Embark. For example, eval-region-advice. It bothered me that none of the evaluate commands are “do what you mean” in the most common sense in Emacs. The most common sense of do what I mean in Emacs is if the region is active, use the region. Otherwise, do the normal thing. All of the evaluate commands should evaluate the region if the region is active. So that's what this does. But I don't use that anymore, because to evaluate a region, I usually use embark-act e. What else is here?

42:26 find-file-at-point and directory names

image from video 00:43:06.133Omar: Oh, some of these things are like tiny things that are almost invisible, like this. In Eshell buffers, By default, find-file-at-point doesn’t realize that if it sees the filename printed in an eshell buffer, it won't look at the prompt to figure out what directory it came from. If you type ls and you're in your current working directory, all of those listed files, the find-file-at-point guesses that they are files in the default directory, and that guess is correct. But if, further above, you had gone into a different directory, called ls there, then those files are no longer in what is now the default directory. So this just adds a little bit of smarts to find-file-at-point. It looks at the prior prompt to see what directory that was run in, and then tries to see if the files it sees there are in that directory. Of course, the only reason I want this is because I sometimes use embark-act on files I see written in the Eshell buffer.

Sacha: I love this. I love how all these little bits of code show that at some point you were annoyed by a tiny, tiny problem and you're like, that's it, I'm just going to write some code and it's never going to be a problem again.

43:49 The value of using Emacs’s APIs

Omar: One thing I like about this is it also shows sticking to Emacs APIs. Embark uses find-file-at-point to guess what things are referred to files. I did this to improve the functionality of Embark in Eshell buffers, but what it really does is improve the functionality of find-file-at-point, which I hardly ever use directly. I almost always use it through Embark.

Sacha: Send it upstream! Okay, so you use Emacs for working with a shell, working with your files, doing math, doing some programming as well. Are there unexpected things that you use Emacs for?

Omar: I don't think so. Mostly I write. It's mostly writing prose. I think I was slightly misled about what a job in academia is like. I mostly write emails. That's the bulk of my job by the time consumed.

44:56 org-ql and usual files

image from video 00:45:18.667Sacha: You have some shortcuts around org-ql for managing your agenda or other things.

Omar: This notion of the usual files. I was often using org-ql to search this set of files: every file mentioned in a refile target, every file mentioned in a capture template, and every file agenda file. Here it is. So I thought that's what I want to search. I want to search every file I mentioned in a refile target, every agenda file, and every file that I mentioned in some template. That's what this does.

Sacha: I don't know if you trust your hiding things enough for us to try that. Since you put so much work into it... Or do you want me to hide the screen first and then you can let me know when it's safe to look?

Omar: No, no, that's fine. I can show you the censorship process. What I thought I would do is I could show you the... Wait, what is this? Why is that not an action? Oh, library. Oh, I have not loaded this. Yes, now it's loaded. Oh, so this should be... Why is this not recognizing org-ql usual files as a variable now that this is loaded?

Sacha: Oh, great. I'm also open to debugging demonstrations live because that is something that a lot of people do.

Omar: Sorry, I think it just hadn't loaded this file. Now I ran a command from here and now I should have a variable. Yes, I have a variable. So we can go to Customize.

image from video 00:46:33.967Omar: The ones that have sensitive information are tasks, home, health, Definitely work. Journal. I don't really mind people seeing my journal, but that's boring. There we go. Yeah. So now I got rid of all of the sensitive files. And so now I can show you. I usually just search through all of these files at once. So I had a list of things I wanted to tell you about.

47:06 Shortcuts for org-ql search syntax

Sacha: I should also point out that your config has some stuff for inserting things into the org-ql search syntax.

Omar: You're extremely prepared for this chat. Yes, C-,has a little key map that will insert stuff like priority. Oh, I don't have, let me remove “Sacha”. Oh, yes, everything that I have with priorities is in one of the files I removed. I only use priorities for work.

Sacha: Okay, gotcha.

Omar: We could use to-dos.

47:43 Org TODO states: TODO, WAIT, DONE, NOPE

image from video 00:47:45.733Sacha: I love that you have a to-do state called NOPE.

Omar: It's for things that are cancelled, but I don't want to delete them yet. Actually, it's mainly there because when I archive them, I want to know that I had that task at some point, but decided not to do it.

Sacha: Well, it's so much less verbose than CANCELLED, so I think I might actually just...

Omar: For a long time, I was using monospace fonts, so I wanted to have everything fit in four letters. So I have... Yeah, all of my, I have TODO, WAIT, DONE, NOPE, and they're all four letters long.

Sacha: Nope. Gotcha. Okay. So that's org-ql and that's your inserting thingy.

48:26 The inserter macro

image from video 00:48:36.667Sacha: The other thing that I wanted to point out that your definition of the inserter was nice because it's a macro. So you have this thing that allows you to just define all these interactive functions. You can add it to the key map because the key map expects interactive functions. If people are watching, yeah, this is something you can do.

Omar: I should tell you that there was actually a serious performance bug previously. What I had before this… This string is a keyboard macro that inserts those letters. It is extremely slow if you do it that way for some reason. I think org-ql searches after the T, after the O, after the D, after the O, after the colon. For some reason, that was extremely slow. So I switched to these lambdas that just call insert. That does it in a single step, and it's instantaneous. But my first instinct was, oh, well, this is a good use of keyboard macros. I'll just assign these to keyboard macros. It's not a good idea in this particular case.

Sacha: I imagine there should be some kind of debouncing on org-ql to make it not do that if you're typing very quickly, but... I don't think there is.

Omar: Let me see if... Maybe also do a longer one so it...

Sacha: That's okay. I take your word for the bug that you ran into.

Omar: I wanted to show you just because it just feels like a really long pause, but it didn't work right now and I don't know why not. That's okay.

Sacha: Curse of the live demo. So that's inserter.

50:05 luggage: generative art experiments

image from video 00:51:32.367Sacha: One thing that I definitely want to make sure we had time for was your little generative art experiment, luggage, because you're having fun with Emacs.

Omar: Yes. Yeah. There are some people doing amazing generative... Oh my gosh. I do not even have it installed. Yeah. Let's... I forgot that we were going to do that. That's okay. But it should be easy. How is :vc used?

Sacha: (:vc (:url …)).

Omar: I have to go to a previous example to figure out.

Sacha: I'm surprised you don't have a consult-line and then just embark-insert.

Omar: I do that. I do that a lot. But I forgot this time.

Sacha: Actually, looking at your config, I learned about consult-multi-occur because apparently there all these multi-buffer equivalents to the commands that I've been using. That is really useful for using stuff from buffers I'm not even looking at.

Omar: Okay, load it.

Sacha: Let's see if it actually can still do the thing. There we go. So you have some Emacs Lisp to generate this SVG. Yeah, and it's just got...

Omar: And which other ones do I have? Luggage. There we go. Tubes. I think this one has some nice other color schemes. Classic? Classic is the one. Oh yeah, stained glasses is the one I wanted.

Sacha: Nice. I wanted to mention it specifically because a lot of times people think, oh, Emacs is a text editor. But because it's also got support for SVG and other types of graphics, you can play around with it. Sometimes it's just doing it for fun like this, but also there might be some other visualizations that you can do with Emacs. That is actually pretty interesting.

Omar: Yeah.

image from video 00:52:26.800Omar: Have you heard of this program?

Sacha: No, I haven't come across it.

Omar: There's an entire book with this title. So it's a single line of BASIC. 10 print. Oh, I'm not, I don't know BASIC, but the idea is like you randomly pick either forward slash or backslash.

Sacha: Oh, yeah, yeah, that makes sense now.

Omar: I'm sure this is not correct BASIC, but, you know, something like that. Yeah, I get the idea. Yeah. And that's what this does. And then you GOTO 10. It's like... It makes these elaborate mazes. It's an extremely simple program.

Sacha: So this is the kind of stuff you do for fun. I mean, you probably do lots of other things for fun, too.

Omar: Yeah. But this... No, that's not the buffer I wanted. Where is... Did I kill it? I killed it. Yeah, one of these I did. What is it? Dominoes. Yeah, this I did for a math talk I gave. It just produces random domino tilings of the board. I gave that talk from an Org file using Prot’s Logos package. I usually use PDF slides, but that time I wanted to use an Org mode buffer because I was going to run code on the computer. Like this, for example, generating random domino tilings.

53:49 Teaching and Emacs

Sacha: So you've given a number of talks. Do you also teach any courses?

Omar: Yeah, I do teach both undergraduate and graduate math courses. Recently, mostly graduate math courses. But yeah, I really like teaching. You always learn something. Even the subjects that you think you know very well, teaching a course always teaches you something new.

Sacha: Have you gotten students into Emacs?

Omar: No, I don't even try. “I use this weird text editor Emacs, it's pretty cool, but it takes a while to learn. I'm not recommending it. I love it. If you do try to use it, you can ask me anything.”

Sacha: Yeah, it's pretty hard. I know some professors are like, okay, this is what we're going to use for the course. But I imagine, depending on your subject matter, you might already have your hands full teaching the subject matter rather than adding it.

Omar: Oh, yeah, yeah, definitely. No, no. The students I try to talk to Emacs about are like the students that are writing their thesis with me. No, never in a course. I never mention it.

54:53 The print10 generator

image from video 00:54:56.900Omar: Oh, there it is. In the docstring, I have the correct program in BASIC. The backslash and the forward slash are consecutive ASCII characters. 206 and 207. You add a random number between 0 and 1 to this one and then round to the nearest integer.

Sacha: All right. You can get surprisingly interesting patterns out of it. That is also very cool. Fun with Emacs. This could definitely be like a zone screensaver if you wanted to.

Omar: Yeah. I just thought it was really nice that Emacs displays SVGs natively. Those are very easy to generate by text.

Sacha: Are there other interesting corners of your config that might not be immediately obvious to people who are just reading the source code? What other workflow things are nice for you?

Omar: Sorry, what were you saying?

Sacha: I can also start just occurring through my config for all the things that I've stolen from your config in the last two days.

Omar: I don't think I have any concrete idea of what to show now. I think we've covered most of the ones I wanted.

56:23 arXiv

image from video 00:57:42.967Omar: As an academic, I deal a lot with preprints on the arXiv, so I have a little library that will show me the PDF or copy the URL. I like personalized software because it does exactly what you needed to do. I noticed that there were a bunch of tags on Mastodon that related to archive papers. Often when I was in a Mastodon buffer, I wanted to do something to the paper mentioned at point. That's one of the acceptable inputs for my arXiv library. So, for example, this is an arXiv link and I can ask it to show me. So that's a bug. This should definitely have visual-line-mode activated. I can just quickly read the abstract without visiting the archive website.

image from video 00:57:51.200Omar: Or I can open the PDF.

Sacha: Very cool. Very convenient.

Omar: Yeah, so. I like that in Emacs you can do all these personal things that you'll need but are not likely to be needed by many people. They're just easy to do. Vim is also very configurable, but the Vim script language is sort of awkward, so I never did anywhere close to the amount of configuration in Vim that I do in Emacs. That's why I would never go back to Vim now. I would miss all the stuff I've written.

58:29 Toggle keymap

image from video 00:59:06.133Sacha: One of the little personal customizations that I liked reading in your config was the fact that you have a key map just for toggling various things like the mode line or the header, you know? Yeah. You want to tell us more about your awesome key map for that?

Omar: You don't need them that often, so it's OK if it's under a long prefix. It's just tedious when you want one of them, to have to type the command name. It also helps me remember which things I commonly toggle. I often have to hit C-h here and see what I have available to toggle. I don't know why toggle is a category for commands, because obviously these are very disparate commands that do very different things. But they're things that you occasionally turn on or off, and it's convenient to have them all together. Choosing the letters here was very difficult. Everybody wanted to have the same letters. L was for visual lines. P for variable pitch mode because I think of them as proportional fonts. It took a lot of tweaking. I'm sure if I looked through the GitHub history, you'd see a lot of tiny changes just changing the binding of one of these.

Sacha: I find it difficult to get the hang of new key bindings, especially for things that I'm not using often enough for the key bindings to stick.

Omar: I often forget that I have a key binding for something.

Sacha: So how do you deal with that? I mean, yes, you stick it in an Embark keymap and you just bring it up to the target.

Omar: Yeah, I do use Embark bindings in keymap a lot to just explore keymaps and remind myself. I don't need to memorize a binding. I just need to remember that I have a binding. If I have a binding, I can find it later. But sometimes I don't remember that I have a binding, so when I'm looking at my configuration, I'll just re-scan what things I have bound from time to time. Mostly I stick with just… I know under what the start of the prefix is, and then I'll just use Embark to remind me of what I have there. Which is nice, because you can also see the docstrings.

1:00:54 isearch-delete-wrong

image from video 01:01:32.267Sacha: I like how you try to use some of the conventions to make it somewhat easier to remember. One of the key bindings that you have that I want to point out, because I think it's a useful technique, is you have an isearch-delete-wrong.

Omar: Right. isearch keeps track of where the last portion of the search string that matched is. You can see it highlighted in the buffer, right? So this means it found up to “del”, and then it didn't find "tok". isearch-delete-wrong will just delete that entire part.

Sacha: So that way, you can just restart from what actually exists. Combining that with the fact that you've got your search whitespace regular expression to be a wildcard means you can...

Omar: Oh yes, this I stole from Prot. He recommends this.

Sacha: Yeah, which means you can use isearch to find things, even if there's other stuff in between them. When you can't find something, you can restart.

Omar: I'm not sure... I'm not sure if this is the best setting. I want to be able to search this way sometimes, and sometimes with whitespaces treated literally, so I should keep statistics on how often I actually have to turn this off. It might be that for me the better default is the other way around. You can turn it off with M-s SPC. Match spaces literally. isearch-toggle-lax-whitespace. I don't know. Maybe for me the default would be to treat whitespace literally, because I find that if I have a space in my search string, I often want to turn on the literal matching. But it's probably still this is the better default. I think I do it less than half of the time I have a space. But it's not that far from half, it feels. I don't have statistics.

Sacha: How do you even collect statistics on this? Aside from making a little note every time you're like, oh, I didn't like this.

Omar: I mean, I would instrument isearch somehow, but I haven't thought about that problem.

1:03:14 isearch - continue from the beginning of the match

image from video 01:03:44.400Omar: One nice thing I do with isearch is another one of those things I got from Vim. isearch, by default, leaves you at the end of the match. I almost always want to be at the beginning of the match, because that's what I got used to in Vim. I think it must be here. I have something exit at start. I tell isearch to exit at the beginning of the match. The way you use this is you install it as a hook, I believe. Is that right?

Sacha: You seem to have options.

Omar: Yes.

Sacha: I see. So S-RET lets you exit at the end, and then by default... Yeah, which is Emacs default.

Omar: But I find that the better default is to exit at the beginning. Yes, and that's the whole point of that. For example, if I want to mark until that parentheses, then I would search for the parentheses, and I don't want to include the parentheses. That's not a good example. But with a word, it's often like, I'm looking for a word, but I want to highlight up to the end of the word. It's just like, if you want to mark a region from point to some search term, with the Emacs default, what you have to search for is the thing that is at the end of the part you want to match. But often I want to say until like the thing that starts here. It's just my brain works that way. So for me, it's much better to exit at the start of the search. Which means I don't understand isearch on other people's Emacs. It just leaves the point in the wrong location all the time. If you're going quickly, you won't realize that it's just a mess. It does mean that I can only use isearch if it's configured this way.

Sacha: Well, that's the thing about Emacs, right? Once you've got it set up, you've got to use your config because everything else just feels off. It just feels weird.

Omar: Yeah, that's right.

Sacha: All right.

1:05:12 Using keymaps to remember sets of commands

Sacha: Going back to the toggle keymap, @gcentauri says, I'm not lazy enough. I just M-x orderless consult, find the thing that I'm toggling, which I do a lot also. I just use M-x for all the things because I can just specify parts of it.

Omar: There's some toggles I don't have in the keymap because I use them very rarely, but yeah. What I like also about the keymap is that it's a place to remind myself of the toggle commands. I often just do this. What was the thing? I haven't used that in a while.

Sacha: Having a shorter list, it means you can just use recognition instead of recall, right?

Omar: It's short enough that I can read through it.

Sacha: I like that a lot. I like the fact that with that Embark C-h screen, you can use completion even to select the commands from that subset.

1:06:04 Other things from the config

Sacha: A couple of other things that I picked up from your config: There’s your dired-open-externally, so it makes it very easy to open something in an external application.

Omar: And it just calls Embark open externally. This function moved back and forth from different places. I think embark-open-externally used to be in consult. Daniel said he felt it didn't fit in with consult. Embark consult would put it in keymaps. He was right. Consult didn't have a very clear personality at the beginning. It was sort of like a grab bag of commands. Eventually, what gelled is that a command should be in Consult if there is a useful way to write previews for it. So, preview is the distinguishing feature of what is a good fit for Consult. Now, I hope Daniel would agree with that. That seems to be the criteria now. That's great. I absolutely love preview. That's one thing I miss a little bit with org-ql. I use org-ql mostly to search through Org files, but the preview is kind of manual in that I use Embark to do it. If I want to preview a command, I just use Embark to do what I mean.

Sacha: Yeah, that's a good idea. I should try that.

Omar: So any command that doesn't have a preview, I mean does, you can just use embark-dwim, it'll complete the command for you.

Sacha: Okay, the kid has arrived, so I have to go off to lunch. But thank you so much for the quick peek into your config. I'll put the transcript together and then people can do that. But in the meantime, people can look at your config for all sorts of wonderful goodness.

Omar: Thanks.

Sacha: Thanks to everyone for hanging out. Looks like the isearch tip was popular, so you might see a lot of people getting that from your config. Anyway, thank you so much for this. I’ll see you around.

Omar: Thanks, Sacha. This was fantastic.

Sacha: Alright, nice.

Chat

  • takoverflow: ​​Hello Sacha and Omar, thanks for this chat! :)
  • CharlieBaker707: ​​Definitely going to add the keycast transparency to my config! I've been wanting that for a while!
  • gcentauri: ​​i'm still a minibuffer noob - its been nil my whole Emacs life!
  • CharlieBaker707: ​recursive minibuffers is amazing. biggest win for me is that it lets you select things and paste them in, like from a completing-read's history for example
  • gcentauri: ​haha apparently i do have recursive minibuffers set to t, along with my Vertico config 🤔
  • Zor_org: ​​was there a time you wanted multiple cursors?
  • Zor_org: ​if so, was there any workaround you thought of with embark or kmacro?
  • gcentauri: ​keyboard macros are a fun mini-game
  • CharlieBaker707: ​I have embark-act set up to expand in the same way expand-region does, but with embark's type awareness. It's also easy to add a contract function.
  • CharlieBaker707: ​I also have a completing-read interface and a transient menu to jump directly to one of many types under point that I'm seeiking.
  • CharlieBaker707: ​For sure!
  • CharlieBaker707: ​I was going to create a tiny extension, but I can open a PR in embark!
  • Zor_org: ​even more crazy with elfeed 4.0
  • gcentauri: ​I found Orderless and Embark through Daniel's suggestions in his packages :)
  • Zor_org: ​if emacs gets canvas patch soon, more things can be done in luggage (lik gifs and image frame as well)
  • gcentauri: ​i am not lazy enough, i just M-x orderless consult find the thing i'm toggling
  • PuercoPop: ​​I didn't knew isearch had a built-in way to fix the isearch quirk. Now I can remove the snippet I use the implement it that I cribbed from the internets
  • gcentauri: ​yeah adding something to a keymap you make does help recall
  • PuercoPop: ​​The isearch quirk is a common complaint from what I understand
  • gcentauri: ​yeah i'm gonna use that iserach bit
View Org source for this post