Categories: geek

RSS - Atom - Subscribe via email

May 29: Emacs Chat with Omar Antolin Camarena

| emacs, emacs-chat-podcast, emacs-chat

On May 29, I'll chat with Omar Antolin Camarena about Emacs and Life.

(America/Toronto) = Fri May 29 1030H EDT / 0930H CDT / 0830H MDT / 0730H PDT / 1430H UTC / 1630H CEST / 1730H EEST / 2000H IST / 2230H +08 / 2330H JST

Related links:

This session will be recorded, and I'll update this blog post with notes: https://sachachua.com/blog/2026/05/may-29-emacs-chat-with-omar-antolin-camarena/

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

View Org source for this post

YE29: Sacha, Prot, and Philip Kaludercic Talk Emacs: Newcomer Experience

| emacs, community, yay-emacs, stream

Philip Kaludercic wanted to continue the conversation from YE24: Sacha and Prot Talk Emacs - Newbies/Starter Kits. He's spent a lot of time thinking about this as one of the main contributors to newcomers-presets.

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

Chapters

  • 0:06 Opening
  • 3:01 newcomers-presets user option theme; would be nice to explain what the changes are
  • 5:03 finding a balance between "it's fine the way it is" and "just use Doom Emacs"
  • 6:39 people value stability, but also conventions have shifted.
  • 6:53 ways Emacs does things differently: ex: terminal vs eshell, output is editable; new users want to edit the previous prompt; sometimes goes against people's intuitions
  • 9:23 How do people develop Emacs intuition? Immersion
  • 9:58 example: dabbrev, there's no undo? Ah, it's just the regular undo.
  • 11:03 newcomers presets: smooth over the intuition-disrupting things that are not actually necessary/beneficial; ex: enable whichkey
  • 14:35 newcomers-presets choice is not saved at the moment
  • 17:09 newcomers without much computing experience might even find it easier (no C-c expectations, C-v etc)
  • 18:32 Focus group?
  • 22:18 Emacs survey before
  • 22:50 people's backgrounds influence their responses
  • 23:49 Hypothetical: Reset themes, to reset things back to the defaults of a specific Emacs version
  • 24:22 package-autosuggest-mode suggests based on file extension
  • 27:58 Emacs 32: bundled versions of Emacs (Big Emacs - distributions that include more packages)
  • 29:58 Selection versus multiple completion
  • 34:41 Manuals
  • 35:11 More examples?
  • 36:24 find-user-init-file?
  • 38:40 Getting over the reverence for Emacs's history
  • 40:13 Changes are more likely to happen when someone puts in the work to make a patch
  • 44:06 Preserving Git history of packages absorbed into the core
  • 46:02 Dealing with multiple types of Emacs
  • 48:11 Fat Emacs is just about bundling more packages from ELPA, not changing the configuration for them
  • 51:24 Customize
  • 54:44 CUA - Common User Access
  • 55:04 ini file format? https://sdf.org/~pkal//blog/emacs/ini-init.html
  • 55:13 Emacs configuration generator
  • 55:56 INI-style configuration
  • 1:00:25 Quick summary
  • 1:02:29 Continuing with INI
  • 1:04:45 Motivation
  • 1:06:54 Politics and philosophy
  • 1:09:26 Experimenting with things outside core
  • 1:10:45 Extending the core
  • 1:11:55 Guide to contributing to ELPA
  • 1:13:13 Making the newcomer experience better
  • 1:14:33 "user option themes" versus "appearance themes"
  • 1:16:54 configuration generator in Emacs? maybe more wizards?
  • 1:17:04 Starter kits
  • 1:17:42 Configuration generator in Emacs Lisp?
  • 1:18:42 extending the archive format
  • 1:20:58 User interfaces

Transcript

Expand this to read the transcript

0:00 Opening

Sacha: I'm going to start recording. I'm going to do the thing. I'll let you know. Okay. Let's do this. Yeah.

Prot: Yeah.

Sacha: Yeah. Okay. Hang on a second. Starting, going live. Okay. So, hello, everyone. This is Yay Emacs 29. And today I am here with Prot and Philip Kaludercic. We're having this conversation about Emacs newcomer experience, which started off with an Emacs carnival last month about newbies and starter kits, which Cena started and you fleshed out with more questions. And now this is snowballing to, okay, let's figure out what we can do to make Emacs easier for newbies who are coming in, maybe they're non-developers who have heard good things about Org Mode, or maybe they're developers who want to try out what this Emacs thing is and what's all the fuss about having an editor that's been around for so long. Or maybe they're actually still VS Code or Vim fans, but they really just want to use Magit, so they're coming in just for that. A lot of different paths to coming into Emacs. We do have this live stream, so if people have questions, I will at some point figure out where the chat is on my screen so I can read them out to you. But my plan here is I'll just be in the background taking notes most of the time and interjecting with occasional questions. And maybe Philip and Prot, you can go brain dump all the wonderful things you've been thinking about the Emacs newcomer experience.

Philip: At this point, regret not having written down any notes from the last video or from your last recording of YouTube, because I noticed I had a few things I wanted to add or intersperse. But I guess we can take a look at two things. So first one is the state of introducing people to Emacs now. And the question there is, who are we introducing Emacs to? Just like you said, you sketched out a few different profiles of people who presumably have entirely different Interests, motivations, like if someone wants to just use Magit like Emacs is there. It's the tool, it's the GUI that implements Magit, then these people have an entirely different motivation than someone who actually says, well, I'm coming at it from, I heard it's an interesting tool for free software development. Build your own or like understand free software in a different sense where you can actually do find function and open the definition of the function you just use. And I think malleable is the current catch word that people like to use in that context. So there's some issue in that sense.

2:59 newcomers-presets user option theme; would be nice to explain what the changes are

Philip: And then the specific comment from the last discussion which caught my attention was We were talking about Emacs 31, there's this preset theme, the newcomers-presets theme, which is implemented as a user option theme, or that's how I like to refer to it. And I probably should just briefly stop and say that everything I'm saying is from my own perspective. I don't feel comfortable saying that this is the Emacs level perspective or that any other of the Emacs developers necessarily have to agree with me. I just think that I might have a few things.

Prot: Sorry, I lost your audio. Just to say I lost your audio, Philip. Excuse me. Sorry, I lost your audio for a second. You could hear it fine. I will hear it in the recording.

Sacha: Okay, so basically, you can repeat it, I guess. Go ahead.

Philip: What did I say? So you were saying that... I'm not representing emacs-devel. These are my views which are informed by the discussions that we had in emacs-devel that I hope will be represented. I think I'm the maintainer of the preset theme, but of course other people are also contributing to it and adding other options. Specific points I had like the target audience of the preset theme was not people who would be particularly interested. What the options are. I think that was a discussion point last time. I admit it's a technical deficiency currently. There's no pretty way. I think it would be nice if we extended describe theme to actually list the options that are modified with hyperlinks so that you could look into these options. That's currently not there. We didn't add it in time for the feature cut for Emacs 31, but I think for Emacs 32 that's going to be an interesting Feature to have at some point.

5:00 finding a balance between "it's fine the way it is" and "just use Doom Emacs"

Philip: And actually the idea had been floating around I think like every time there was like there's a periodic, periodical discussions like how should we make Emacs more user-friendly on Emacs level and people say we have to like say the extremist position is what do you mean not user-friendly. It's perfect the way it is. It's God-given configuration. And the other people who say, well, why don't we just install Doom Emacs and make that the default then? Somewhere in between, I think there is a reasonable position to be had. But in these discussions, one of the reasons this came... I participated maybe in like... Four or five of them and then this point came up. Why don't we have a theme like a collection of user options which you can toggle in one switch which enable all the options from which we would not find which existing users would not find interesting which are always the bulk of the users most people are already existing users they don't come in and one of the things are lots of existing users I'm thinking of like A 60-year-old professor who has been using Emacs for 30 years or a software engineer who's using it and maybe consciously or unconsciously appreciates the fact that it doesn't change every few years. You don't have a graphic designer. This is, of course, me against graphic designers and UI designers who have a need to reinvent the UI interface every few years and then things change. And how do I save now? What's the... What's the button to do this? And the UI changes.

6:37 people value stability, but also conventions have shifted.

Philip: The people who value the stability. But of course, the common conventions have grown apart. What Emacs does and what people are used to from other programs.

6:50 ways Emacs does things differently: ex: terminal vs eshell, output is editable; new users want to edit the previous prompt; sometimes goes against people's intuitions

Philip: Now, at this point, we also have to distinguish that there are things which Emacs doesn't do the way other programs do, which are... Which I would argue are actually sensible. For example, I think one issue I remember was when I first started using Emacs, I had a terminal emulator. I wanted to have a terminal emulator within Emacs. Nowadays I use Emacs Shell, which to me seems like a more truer Emacs experience. It's an opinion, a strong opinion maybe. And it's also influenced by a history of using Plan 9 and that kind of terminal where actually the output is just as editable. You can just search it. You can edit it. You can cut it. You can interact with the output any way you would use a normal text, which is not something you can do with a terminal for purely historical reasons. At my university, the university where I studied computer science, I frequently helped people in the introductory Linux course. One thing you notice there, these are real newcomers. These are people who have never used Linux or a terminal or anything like that before. The first thing they do when they want to, like, they use the arrow keys expecting or click on, they use the mouse and click on the previous prompt. And they want to modify the previous prompt. Of course, that doesn't work because that's not how terminal emulators work. All the previous output, that's fixed. You don't touch that anymore. Everyone, I guess even people who we describe as newcomers, Talking about Emacs. Obviously, no. Of course you don't touch the previous prompt in the terminal. These are some expectations you have if you use Eclipse, if you use VS Code, if you use... I'm not sure how the NeoVim terminal emulator works. I know they have a built-in one. I think Vim also, but I'm guessing right now. So there are some accumulated intuitions which Emacs actually intentionally doesn't want to give. doesn't want to give in all purposes because I'd argue that one of the strengths of Emacs is really having this uniform text interface where I can use I search, I can use occur, I can use the highlighting commands, I can just select a region and write it out to a buffer. And stuff like that. That shell buffer is no different than anything else in that respect. Please interrupt me by the way. This is not supposed to be a monologue.

Prot: No, no, no. Go ahead.

Sacha: So it sounds like there's an interesting challenge here.

Philip: Breaking some of these intuitions is legitimate.

Sacha: Yeah.

9:21 How do people develop Emacs intuition? Immersion

Sacha: How do we help people develop the Emacs intuitions?

Philip: To some degree, it really feels like it has to be something that you immerse yourself in. The issue, I guess, is, well, I know, I mean, I knew people who actually used Emacs. I mean, you can help them in a face-to-face setting or like Prot does in his teaching settings. Then you communicate certain things, which I don't want to say they're ineffable. It's not like you couldn't write them down in a manual, but it's also... Like the mentality that people have.

9:55 example: dabbrev, there's no undo? Ah, it's just the regular undo.

Philip: A different example I have, like, I remember I was using daabrev for the first time or something. For a while I was irritated. There was no undo. Like, how do I go back to the previous text expansion? Until at some point I realized, oh wait, it's just regular undo. That's just the way you undo it. But somehow writing this down in a manual is... It's not an easy thing to always think of these things. For me it seems obvious now, but at that point I specifically remember it was unintuitive. I had this accumulated expectation from other programmers if I have a text expansion in this case that I'm actually cycling through some special sort of menu, not thinking of it as just regular text buffer operations. Just text editing in some fancy way. But that's one We should keep in mind. This was all related to the preset theme in some way, right? You're writing this down.

Sacha: Yes, I'm writing this down. That's why we have notes.

11:00 newcomers presets: smooth over the intuition-disrupting things that are not actually necessary/beneficial; ex: enable whichkey

Sacha: So what I'm thinking is you wanted the idea behind the newcomers presets is to kind of smooth over some of those intuition disrupting things where people are coming in with maybe expectations of how stuff should work in a modern editor.

Philip: Specifically the intuition. Go ahead. Specifically the intuition-disrupting things which are not necessary, in some sense. Like, we wouldn't want to be an intuition disrupt... like you could probably... Like Cua mode or something that would be something where people if they would start using... If you would enable Cua-mode by default, that would inhibit further development, because then it might be confusing with using C-c, like if you... because suddenly Delay becomes a user input, which is usually not the case with Emacs. I know which-key is an exception in that case, because which-key pausing actually is an action and displays a pop-up buffer. And we do enable which-key due to popular requests and the preset theme. I personally was a bit hesitant about that one, but it seems to be something. where you have to really weigh it on a case-to-case basis. But, Sacha, do you have the... What version of Emacs do you have running there? I can't make it out.

Sacha: Yeah, this is Emacs 31, so I do have... So you can open the preset theme, right? Yeah, yeah. Hang on a second. Let me bring up a... I have now a terminal, so I can... Let me bring up a completely fresh Emacs.

Philip: No, I just wanted to open the file. Because in the file there is a prelude. There's a commentary section that actually explains the curve. It's not a library.

Prot: That's exactly the joke with the... Yeah, that's part of the problem with those themes. That's the problem. Wait, really? It would be easier if they were all there. It's a kind of an implementation detail that from a user it doesn't really make a difference.

Philip: You have the same problem with all these things, if I remember correctly. Yeah, yeah, exactly. Yeah, and you see up there the commentary section?

Sacha: Yeah.

Philip: If you scroll up a bit, it's above line 37. The theme configures which we can reasonably expect the average user to want to enable, but would otherwise be unlikely to discover on their own. That's sort of the overall guide of what options we want to add. That's why it's also an option on the splash screen. You just tick it and then the user options enablement theme should be activated by default.

Sacha: That's sort of the idea. So it is available on the splash screen. So if I say display splash. Oh my goodness, how do I get to the splash screen?

Prot: It's C-h C-a or not? I forgot. There are two things.

Sacha: There's a splash screen and there's the... Hang on a second. I'm just going to start a new Emacs.

Prot: Yeah, I haven't done that in, like, I don't know. That's the about Emacs screen. But you have a display splash screen. C-h C-a on mine. About Emacs. Emacs about Emacs.

Sacha: Then I have a better idea. I'm going to start this new Emacs person. Okay, here we go. New Emacs. Fresh person.

image from video 00:14:32.733Sacha: So we click on this, right? And it turns on a bunch of things including the tab bar.

14:32 newcomers-presets choice is not saved at the moment

Sacha: I wasn't entirely sure how people would save that so that it happens again next time. Is the idea that they just keep checking that box?

Philip: That's not done currently. That's something we haven't simply decided on. The current presentation is you enable it in that mode and then you'd have to, which is of course saying it out loud makes it sound stupid, but you'd have to persistently save the themes. So then I think it's optional to save themes and then...

image from video 00:15:14.000Sacha: It is possible for people to get to it if we leave them a breadcrumb. But it's not going to occur to them because it would never occur to them to say customize Emacs, custom themes, and then I can pick newcomers themes from here.

Philip: It's a point that I at least intended to mention at some point. Emacs level whether we want to make this because currently it just loads the theme but it doesn't persist the choice but it could just as well persist the choice. There's a discussion to be had which of these two behaviors is more intuitive because of course if you persist the option then you have the disadvantage that someone might enable it but doesn't actually want it but now somehow their Emacs is broken from their perspective. I don't want tabs or whatever they say or I don't want which key and they don't know how to disable it so this is I wouldn't say it's an obvious decision in either direction.

Prot: Like if there is an enable button or save, there should be a disable and unsave, like remove. Yeah, that's the checkbox idea in that case.

Philip: That would be the tricky part. And especially finding the place on the splash screen so that this actually works for everyone. Because if you open it in a TUI mode, I think then initially, if I remember correctly, we had this button or this new to Emacs line was underneath the copyrights. No, no, that was a different thing.

image from video 00:16:46.233Philip: If you click on newcomers preset, for example, then you are redirected to the manual entry. And I think we had some, yeah, there's this, the top line. If you got here by clicking the link on the splash screen, that was on the bottom. That was on the bottom of the manual entry. But if you open it up in an 80x24 terminal, you wouldn't see this line.

Sacha: You can't see it and you don't know how to... These are the complications that you have to keep in mind in that case.

Philip: You might not have the intuition to space the scroll, which I think that's the case in less. But yes, again, you have this accumulated intuition from using Unix tools. Which is one of the points I wanted to bring up.

17:08 newcomers without much computing experience might even find it easier (no C-c expectations, C-v etc)

Philip: Who is this mythical newcomer? What's their actual background? Because I claim, and this might be controversial, that if someone's actually new to using computers at all, which is something I have seen, like people who have never programmed, people who have never used Unix, people who have never used more than a web browser, to exaggerate, they appear to do fine with Emacs because they have no expectation of using C-c, C-v, C-c, and so on. They know that they have to use the buttons up there. So in that sense, they're fine. There's an optimization loop when you're used to these shortcuts and a few of these conventions how to move around, that Emacs defaults appear to be inconvenient. So that's also a distinction you have to make in that setting.

Prot: Exactly, exactly. Plus you cannot optimize for everybody. Eventually you just have to make some assumptions.

Philip: Exactly. But what these assumptions are is the controversial...

Prot: I think the way you approached it makes sense. This is the reasonable way, I think, to do it. You have to assume that they have this background knowledge. And if they don't, it's what you said. They don't have to relearn something because they didn't know it to begin with. So they start from a good basis.

18:30 Focus group?

Sacha: Is there interest in having some kind of focus group or something like that so that if we come across newbies, we can say, hey, you know, the developers would like to be able to float some questions once in a while to see what actual newbies would think of this?

Philip: I have actually tried this once. I was in a hacker... what's it called? There's this computer club in Germany and they have local events on a regular basis and I was going to one anyway because a few friends of mine were going there and then I did an introduction to Emacs course there and printed out a survey basically, a questionnaire for Emacs neophytes. I think if you search for that string on the Emacs development list, you're going to find that. And I gave a few people these texts. I printed it out. It was actually pieces of paper, so it wouldn't be personally identified. There wouldn't be any information there. And one of the things I thought was interesting in the results was that the main thing people were saying was it's overwhelming. Like the amount of things... Just the default Emacs. No configuration, no options, no auto-completion, no fido, whatever. It was just so many new things, so many differences that they lost an overview, basically. This was a group of people who, I think there were questions, and they were like, how long have you been using computers? Because, of course, it was so generic. What previous UIs have you had experience with? Most people use Eclipse or Vi, NeoVim and even reasonably complex Vim configurations. Of course, this is a bias due to the setting in which I was asking these questions. I'm actually planning to repeat this experiment because I'm going to another one of these congresses or these meetups in a month or so. I wanted to offer this again to people, specifically seeing if these newcomer presets are valuable or if they help people or not. But of course, doing this in a properly scientific setting would be much more difficult. Yeah, of course. We need money. Difficult steps of doing this.

Sacha: Maybe even like a mailing list. We can say, hey, you know, you're new to Emacs, but you kind of want to make it better. Email this person. And every so often when developers have a question, they can say like, does this make sense to you? Here's a screenshot. Or would you prefer this versus this?

Philip: As in, we would send an email to all the people, but then I think, I mean, the big question, difficulty in that sense is then data protection, I think. That's what I was trying to avoid with having this just printed out and no personal identification, because then we have to store email addresses.

Sacha: Okay, all right. That's fine.

Philip: That's fair. So, sounds like an excuse. Partially it is, but something like, I mean... I'm not saying that my approach, what I was doing was unbiased. There are people who would be more willing to answer these things and people who are less willing. I know the bias in this case because I actually saw the people and I had a feeling for what kind of people they were. So I think I'm in a better position to factor it out. But if it's actually properly, if you just have people who you send emails to

22:15 Emacs survey before

Philip: I'm not sure if it remains represented because there have been these Emacs surveys in the past. I remember at least two generations. And they're of course the ones which are circulated on Reddit, on Hacker News, on IRC, which I still think is a bubble of maybe 200 people. Like mainly 200 people and some people who are Surrounding these groups. So I'm always sort of dubious because these are the people.

22:48 people's backgrounds influence their responses

Philip: I mean, these are people who are much more likely to have heard of, what's it called, Evil Mode or something like that, or had some experience with other editors. And these things all influence their responses. always taints the results. Every time these discussions are brought up on Emacs devel, people have some level of doubts as to how reliable the results are.

Prot: Correct, correct. It's hard to get reliable results, though some data is still better than nothing. But granted, you don't want to base decisions on those results, of course not.

Philip: Yeah, that shouldn't be the last decision-making factor. You should just have a function where the input is whatever the data is, and then the output is mechanically determined by that. Yes?

23:46 Hypothetical: Reset themes, to reset things back to the defaults of a specific Emacs version

Philip: Now, related to the preset theme, there's also been a discussion (I don't think this has been mentioned much online) of so-called reset themes. I'm not sure if you've heard of these. So the idea would be, additionally to having preset themes of options, which we have changed, which we would recommend because the newcomer preset theme makes no real assumption that the options will be stable, so we might change them from version to version, this gives us some flexibility to say we have a new option. Like, for example, if the preset theme had existed since Emacs 29, and now in Emacs...

24:22 package-autosuggest-mode suggests based on file extension

Philip: That was actually the reason this entire discussion started when Emacs 31, that's the current release... to be released, there's this package-autosuggest-mode so that's a little prompt, when it's enabled, a little prompt in the mode line. You can click on it, Emacs installs the package which it believes to be the right one for the current file.

Prot: The major mode, right?

Philip: No, it's a minor mode. It's a global minor mode.

Prot: No, no, I mean, but it installs based on the major mode, right?

Philip: Ah, yes, yes, yes. It installs a major mode package, which matches the current file format being used based on auto-mode-alist or the magic, what's it called, magic file alist and all these things, and it can... We didn't want to enable this by default, but we wanted to enable it for newcomers. That was actually the first option in the newcomers preset. If the preset had been older, we would have still wanted to add this to the preset theme. It's not supposed to be set in stone. Now the idea with the reset theme is, and this is still hypothetical since we haven't implemented it, is to have reset themes for specific Emacs versions. So we, in Emacs 32, we might have an Emacs 31 reset theme for all the options that we have changed in Emacs 31, in Emacs 32, so that we could reset them to the previous option. So that in this sense too, if the discussion, if the question is really just, we don't want to annoy people who have... When upgrading, of course, it's still a minor inconvenience because they have to write load-theme emacs31-reset in their configuration, but it would be easier for them to actually undo any changes. And in future versions of Emacs, hopefully also persist these changes so that you can really sort of like pinning your version of Emacs, a soft pinning of options. So this is something for the future. Consider as well, which would be reusing the theme approach, which is another reason why I hope that the notion of user option themes will become more, because it's been there from the beginning. The Customize system has always supported user options to be added, but people have always only customized, not only... I'm not sure no one has ever done it, but it has not been a popular approach to use the user options, even though the technical facilities have been there all the time. That's also going to be interesting if the reset theme would be forwards compatible. But that's another discussion that makes it even more complicated. So that you could add them hypothetically to ELPA as a core package.

Prot: Nice. Yeah. Of course, the reset themes, if you implement them, that's great because it opens up the possibility to be a little bit more ambitious with the defaults and break.

Philip: Yeah. Because that's exactly... Every core... Every default discussion boils down to: if we break this, people won't understand what changed. If we change this, people won't understand what broke. But on the other side, people like all new... Can we reasonably assume that all new people would actually want this theme? Then we want to give us some sort of more flexibility in this sense without actually the support, because I think that the value proposition of having a stable interface where you can expect the appearance of the theme to be somewhat stable over time, how Emacs behaves, that's actually a positive thing.

27:52 Emacs 32: bundled versions of Emacs (Big Emacs - distributions that include more packages)

Philip: And finally, in Emacs 32, this is also a finally. For now, one thing I just thought of, which I was reminded of, there's a big plan for Emacs 31. This is one of, I've never pronounced his name, Sean Whitton, I think it should be pronounced. He said that one of his plans as a maintainer will be to work on the bundled version of Emacs, which some people, including myself, have been calling Fat Emacs. So adding, selecting certain packages from ELPA, from GNU ELPA, and bundle a secondary distribution of Emacs which would include additional packages, Which are currently, so for example, one example would be org-tex. And then you could, when you install Emacs, you could install, I don't know, big or fat or whatever... Big Emacs with all these packages pre-installed, which would be pinned to the right version which we would have hopefully ensured that they're actually compatible with one another. And then you have the normal Emacs, which would be the thinner one. And an interesting corollary of all of this would also be that if the way from ELPA into the core would be made easier, that the way out of the core into ELPA would also be made easier. Because that would mean it's more easier to deprecate packages over time since you can install it. This protective layer, let's say, protective layer, protected merely by inconvenience and the annoyance of moving these packages in and out, would fade away over time. Some cruft within Emacs itself, within core Emacs, could be moved to ELPA. So we could actually thin down Emacs. That's one possibility. Oh, that's big. Yeah. One strand of commentary in that direction. That's something that I'm planning to help in the Emacs 32 development cycle. Because these options then could also be in... Any options related to this could also be added to the newcomers preset theme.

29:54 Selection versus multiple completion

Philip: So one could of course... Vertico or these interactive selection packages... I think I've commented that before there is a certain controversy there. I think that there's a certain controversy that selection is not always the same as text expansion, which is sometimes like... There are, I think, the certain... skeleton, or there's this insert... what's it called, auto-insert command... It's not auto-insert, something like that, that prompts the user for multiple things, but it's not written using [completing-read-multiple], but it's written in a way that there's a manual loop, which waits for an empty input to occur. But if you're using vertico or fido, by default, if you just press RET, you don't actually have an empty input. You just select the default option. There's settings like these which where these sort of these two kinds of completion diverge from one another which which is also something I've been talking about for a few years but never came around to implementing that there should be an API distinction between actually selecting user options from a list and the completion interface which we have for files or commands currently. These are semantically two different things, which would be interesting to see if it would be worth distinguishing the two in a technical sense, because that would mean that in certain settings, we could enable Fido. I totally admit that Fido and Vertico have their advantages when it comes to discoverability over standard text completion. The compromise now was that in Emacs 31 there's this option, I think it's eager completion updating or something. It's a combination, it's a permutation of these words in some sense. So that's if the completions buffer pops up. No, you don't have to... It doesn't matter. You don't have to visualize it. Yeah, where they update as you type. Updates as you type, yeah. But that doesn't occur down there, but it only occurs in the completions buffer. That's sort of a compromise. That's Fido, right?

Prot: But the generic completions has had a lot of improvements over the last few years. And in Emacs 31, it's in a very good state, all things considered.

Philip: Which was also partially driven by your MCT package?

Prot: MCT, yeah. Which was an experiment, of course. But yeah, it's basically that idea. Because I have used this in earnest, like the default like this, I have used it for a long time in earnest, like just defaults. It's very good. It's for sure very good. Whereas Fido and Vertico are better if you are just getting started and you don't know that there is a completion on the mini buffer and somehow there is a distinction between the two. Like, for somebody who is getting started especially, I think this interface is not good. But if you know what you are doing, I think this interface actually works perfectly. And it has a lot of options. So, Sacha, what you are showing there is the absolute default, but it has so many options that you can make it look actually quite different from this and very similar to Vertico, for example, in terms of the user experience. I just realized that...

Sacha: Oh, I just realized that if you do the TAB TAB, if you do the TAB TAB, it now goes to that one, which is great, but you can't filter it from there. You can't type into it and have stuff happen.

Philip: Yeah, it's not down there. If you're down there in the mini-buffer, you type. There you have just a regular text buffer, so you can search or you can select stuff out of there.

Prot: And that's also an option, by the way. So what happens on the second tab, for example, so you can configure that.

Sacha: Right, so that was the second tab behavior from newcomer-presets.

Philip: That's the option I proposed and then objected to.

Sacha: Yes, work in progress. So basically, you have these newcomers. We're trying to figure out how to get them through their learning journey. The newcomer presets can smooth over some of the edges. It can get over that "Yes, there are a lot of options, but at least M-x with tab completion will show you the things so that you don't have to memorize the names as much." You can recognize them from the list. You can narrow it down.

Philip: The behavior is supposed to actually be similar to Bash. Yeah.

34:39 Manuals

Sacha: It's probably still... we're going to need them to read the tutorial and we're going to need them to use a lot of patience as they get used to Emacs. I am not quite sure yet if we can get them all the way to, all right, here's how you open your config file and define your own keyboard shortcuts, for example. Bit of a journey.

35:08 More examples?

Prot: I think that one way to do that is to have more examples in the manual. Like, here is how you do this, here is how you do that.

Philip: Or there's this other manual, the Emacs FAQ.

Prot: I don't mind where it would be, like FAQ is totally fine. I don't mind exactly where it would be, but somewhere in the documentation, like common patterns of Emacs configuration kind of thing. Maybe it already exists, so if it exists, then of course even better.

Philip: Emacs FAQ has some things on finding relating packages... Where is the FAQ?

Sacha: It's a separate manual. We do not have it from here, not from the splash screen, but it is available from the Help menu.

Philip: I think it's not been that thoroughly maintained.

36:21 find-user-init-file?

Sacha: I'm going to take advantage of the fact that you've actually been reading emacs-devel. Has there already been a long discussion about whether a M-x visit-user-init-file makes sense? An interactive command that you can use to open... I was trying to find it, but even with Yhetil's search, I was like, okay, there are four threads. One of them was a long time ago, and the other one was from even longer than that, so I didn't know whether it was some other discussion.

Philip: I don't recall any such discussion recently, but I also don't think that anybody Objection to it. So it's really just a matter of someone writing it down and adding the documentation.

Sacha: I would like to do that.

Philip: It would be quite likely 24 hours.

Sacha: Okay.

Philip: On the master branch and not Emacs 31 branch, which would be slightly. It's fine. Yeah, but even having a button.

Sacha: If it makes it in someday, it doesn't have to be in the splash screen. It just has to start off being available through... And then we don't have to keep telling people, oh yeah, do a describe-variable on the init file just in case your init file is actually .emacs instead of the .emacs.d/init.el that other people are telling you to use instead. It's a bit of a mess, right?

Philip: I think some people have been recommending doing M-: and then calling the [find-file] function with the user init... What's the name of the variable again?

Sacha: user-init-file.

Prot: User Emacs file.

Sacha: Here we go. user-init-file. Here we go. That's the thing. Yeah, exactly.

Philip: And if you do M-: (find-file user-init-file), then it would basically do the same thing. That's why I'm saying it's such a minor function that I don't expect any objections.

Sacha: Okay, okay. So I'm going to suggest that to Emacs Devel at some point.

Philip: I've had the same idea many times myself, but the transience of memory has thrown its way before I actually ended up doing it.

38:38 Getting over the reverence for Emacs's history

Sacha: Sometimes I am reluctant to suggest things because I figure Emacs is such a long history. Probably someone has thought of this already, and it's probably been discussed and bike-shedded. But I think there are little things that we can do.

Philip: Yeah, but then in that case, Yeah, but I think that's actually related to another thing I wanted to talk about. There's a certain sort of reverence that people have for Emacs, because it's such a historical project. But I mean, the preset theme was something that was discussed for many times, and there were basically no objections. No one said, no, we shouldn't do this, this is a bad idea. I hope it's not only because I proposed it or something, or like the package also suggests that. Most of the things I've been working on for Emacs 31, no one objected to. And there's two sides to this. There's some people who actually go overboard with this and try and reinvent. Like when reviewing packages, you see this a lot of people try and reinvent functionality, which is basically just giving a new name Combining two things and giving it a new name which isn't always necessary but might be useful and then it's some discussion like can we actually make more out of this and that's a different thing but then there's the people who I probably lean more towards that side when I think to myself the way I'm doing this is stupid or this is not as efficient people have been using Emacs for 40 years of course there probably has to be a better way to do this

40:11 Changes are more likely to happen when someone puts in the work to make a patch

Philip: And sometimes it turns out it simply hasn't been implemented and no one has simply done this actually small effort of preparing a patch and ironing out the details just some people don't like discussions of course and it's understandable but you can I mean there's really no harm in sending a patch and then saying I'm sorry I don't have It's annoying, of course, from a maintainer's perspective. I don't recommend doing it, because if you prepare a patch but don't have the time to finish it up, then if it's a useful thing and you actually get someone to be interested in maintaining it, then bringing the patch to completion, then it's well worth just sending a feature. Even sending a feature request, you don't even have to... I mentioned the idea of this preset theme many times. I wish people would be more conscious of this mentality, but I totally understand people who think otherwise, because when the first time I sent a patch to a mailing list, I was, I don't want to say I was sweaty, but I was really nervous because I don't know what if they... Goodwill, good faith, attention to how people should behave on mailing lists, how they should treat each other. Lots of these preconceptions turn out to be false in there. That's why I also wanted to participate in this, so that people see, oh, the people maintaining Emacs aren't wizards locked up in a tower, but just, I hope, normal people. Yeah, that's a very good point.

Prot: And I think, Philip, just to add to this, your example of leading with a patch, I think, is also key here for someone who can write a patch, of course, because it cuts out a lot of that noise, that initial discussion of, well, maybe yes, maybe no, because it frames minds. It focuses the attention on something concrete. And that can also... Yeah.

Philip: Yeah. And... I mean, having a patch is useful, but getting someone interested is also helpful. Like the discussion when we merged which-key, I helped with that process. And I'm not, I think it was, I don't remember his last name, Jeremy, who actually did most of the work. And I was reviewing his patches. I was helping along, but I wasn't actually writing most of the code. I was just going over the proposals and helping along and basically pushing the... Stunning the process whenever it got stuck so that we actually made the necessary changes for it to get merged.

44:03 Preserving Git history of packages absorbed into the core

Philip: And then I did the last finishing touches of merging, because that was also something... Every time... We'd like to preserve the Git history of packages we merge upstream, which is probably something we won't be doing in that way when we do the Fat Emacs releases. But the entire history of Eglot and the entire history of which-key is actually preserved in the

Prot: So they are wizards after all.

Philip: Wizards just reading pre-written down spells.

Sacha: It'll be interesting to see if some of the starter kits move to using that kind of fat Emacs infrastructure once that's in place. Because a lot of times the starter kits are there to package together. Okay, here's a list of the packages that it uses. Here's the configuration that makes them play nice together. And then here's some kind of Documentation or videos or a demonstration on how to use it to help people get started.

Philip: So I'm curious to see, I mean, I went reviewing the options to add to the preset theme. I actually went through a number of these starter kits to see the options they suggested. Selected those out which seemed reasonable to me. And of course, this was discussed and people objected or added other things. But I am curious to see how the starter kits will evolve in the future, because that's also something we should mention.

46:00 Dealing with multiple types of Emacs

Philip: I mean, there is a big problem with the fat Emacs approach and suddenly you have two versions of Emacs. You can write a package which appears to work fine in fat Emacs, but it depends on a package which is not in the core Emacs release, and then that's something we will have to deal with in the future as well. Yeah, that's a tricky part indeed. Yeah, but another thing relating... Yeah, the sort of fragmentation of what core Emacs is. It might be a showstopper, so maybe everything I'm telling here is just a wishlist. It doesn't end up actualizing. And that fragmentation of the setup is one of the things... Because it's not actually really difficult to solve. I mean, if you have a package that depends on something from Fat Emacs who just added to the package requires lines, you explicitly state the dependency. But if people are sloppy, then they might not notice this immediately. And you have runtime issues when people are slow.

Sacha: It's a little bit more than that, right? So for example, if you have a newbie asking a question, because they're using a starter kit or in the future, a fat Emacs thing with different packages installed and different configuration things that they have not personally set up. And they don't have the experience to know, oh yeah, this is going to be related to that. So I should mention it in the help message. I mean, large starter communities like, like Doom Emacs and Spacemacs will have their own Discord or mailing list where people can go and ask for help. And so people will say, okay, I think I kind of know which starting point you're coming from because it's the base. But if we're, you know, with the smaller starter kits, they don't even know how to ask for help. And everyone is like, on the regular Emacs communities, there's a lot of back and forth if you want to dig into, okay, what do you have enabled? What is affecting your setup? Fat Emacs is going to run into that problem.

48:09 Fat Emacs is just about bundling more packages from ELPA, not changing the configuration for them

Philip: To be fair, my understanding currently is that it wouldn't enable any other options. It would just bundle more packages.

Sacha: I see.

Philip: So it would be more of an issue for package authors. Yeah, for package options. The idea is, I mean, I've used Emacs in offline settings where it's like, really inconvenient or impossible to install additional packages and just having more functionality out of the box which ELPA provides and you don't have to install additionally, is basically the idea. Because this has been a project which has been ongoing for years. I think this is ever since the conception of ELPA itself. Which is precisely the reason why GNU ELPA requires all packages to be signed or to be covered by the copyright assignments while NonGNU ELPA does not. So that this is possible. It's just that finally it looks like we're starting to move somewhere in that direction. It would be interesting if a decision were to be made that we're going to give up on This sort of bundling, what decisions that were made for the legal status of GNU ELPA, if we would merge GNU ELPA and NonGNU ELPA together, which is unlikely currently. This is just pure speculation at this point, but it's something that might be a discussion, which will be had in the future.

Sacha: Okay, so it dispenses with a package install part, and so people don't have to worry about, okay, how do I make sure The package archives are set up, and how do I install the packages? All that stuff will be pre-installed. The automated English will be- No, the package archives- Oh, sorry, go ahead.

Philip: The package archives wouldn't matter that much, since we are just talking about the new alpha packages, which are installed by default. It's really just that you don't have to install additional packages. You don't need a network connection. You don't need to know about the package existence. It would be registered in the auto mode alist anyway. So if you open a, I don't know, what's the package, some major mode that's not going to open, which is not in the core.

Prot: I think you might want to talk earlier. I think that would qualify. I think you mentioned org-tex earlier, which is on ELPA, but not in Core.

Philip: The tricky thing there is that Emacs already has a LaTeX mode by default, and that already applies, but org-tex extends it. That's why I was looking for another example. Okay, that's the idea, but it wouldn't only be major modes, I assume. There's going to be some discussion as to what packages we want to add. currently it's not certain. Because we're working on finishing up Emacs 31. That's where most of the bug fixing efforts are going in right now before we progress to any further developments. But that also includes proposals. That includes proposals as to the preset theme, which I am still interested in reading.

51:23 Customize

Sacha: I want to come back to something Prot mentioned in my conversation with him about newcomers, and that is the Customize interface versus getting people to the Emacs Lisp directly. And I think, Prot, you were not very keen on Customize.

Prot: Yeah, basically if I say it in one sentence is I think the earlier they get into Emacs Lisp, like seeing it and interacting with it, the better it is for them long term. Granted, I am making the assumption that this is a user that will be there long term, right?

Philip: Of course. And this is specifically about the customized UI, right?

Prot: Yeah, yeah, not the underlying functionality, like, yeah.

Sacha: It's great for simple options like yes we can check the checkbox or we can select from the drop-down list or whatever but browsing it is as you mentioned overwhelming the general sense of Emacs being overwhelming and when you start wanting to do something slightly more sophisticated like You know, let's add some more capture templates. Then it's challenging for people to do. So I'm wondering whether, in general, we should be, you know, is our general strategy to be guiding people to, yes, Customize is there, but really you want to be doing Emacs Lisp as quickly as possible. Let's make it easier for you to get your init file. Let's make it easier for you to test your init file and not fall apart when you miss a parenthesis and all things like that. Do we want to guide people that way?

Philip: One question I think we should distinguish is the idea of a UI the problem or is it really... Because I personally I have a new Emacs configuration at my day job, and I do everything using Customize. I don't even care about using use-package or whatever. Just customize the stuff using... There's a big blob of user options which I've modified, and that goes through, and I don't care about it, but I claim to have some understanding of what's going on, and the rest of the function is just some defuns which I find convenient. But for me, it's okay, because I have some sort of intuition of how the Customize UI works. If there were a better UI for Customize, would you still say that if it were written in an intuitive way, say using Fido modes. So that's, it would use interactive narrowing and it would somehow work in a build on existing intuitions because the current customized, the Customize UI, the easy customization interface I think is a technical term to use is based around this widget library interface and sort of make replicating a TUI menu but not... And then you have to... And yeah, of course, the intuition... Like, if you click on things, it doesn't always behave the same thing you would expect from a regular settings menu, which is by the way also something that CUA specifies.

54:41 CUA - Common User Access

Philip: I recently looked into what CUA lists. Like, if you look at the Wikipedia page, CUA specifies that every application has to have these settings menu with tabs on the bottom on the top where it lists all the options you can specify and interestingly C-c and C-v is not listed as...

55:00 ini file format? https://sdf.org/~pkal//blog/emacs/ini-init.html

Philip: Apparently not CUA, but Shift Insert and Control Insert... I might be misunderstanding this, but this seems to be a misnomer.

55:10 Emacs configuration generator

image from video 00:55:45.367Philip: But if we had some sort of a UI like this CUA configuration UI, would that be something where you'd say as an intermediate stage for just setting options? Because that was part of my thought process with Emacs Configuration Generator. Just configuring Emacs is such a subset of Lisp as it's actually not programming Lisp. You can easily get by by just using add-hook, set up or setq, and add to list or stuff like that. But you don't really have to understand. It's just a peculiar syntax for how to program Lisp.

55:54 INI-style configuration

Philip: I'm not sure if either of you have seen, I wrote a blog post last March, no, not March, what's the name of the month? November, October or something, where I gave a prototype for a INI-like configuration syntax.

Prot: I must have read it, but I don't remember it. You must have read it. Yeah, yeah, yeah, because I always read my feeds, but now it doesn't ring a bell.

Philip: Exactly. You see there's this basically a simplified syntax, which should be... The idea was it should follow a conventional configuration-like format, and each of these lines gets translated directly to an Emacs Lisp expression. And due to this, I don't want to call it an isomorphism, but the easy translation in both directions, I think that the expectation of saying write Emacs Lisp... There has to be some defun or something if you're writing Emacs Lisp. That's to exaggerate. If you're just writing setq, set, add-hook, add-to-list, these common configuration patterns, which are well worth documenting in the manual, to understand what are the patterns that you have to use to configure a package, even understanding the signature... The distinction between add-to-list and add-hook is that hooks are lists which can have mode-local extensions but also inherit from global settings. Not obvious from the beginning to everyone. This is not list programming.

Prot: Yeah, fair enough. Though even then, they start to see the parentheses, get used to the syntax. They have to remember to quote stuff. Even though it's not really programming, I see what you're saying. They put themselves in the situation.

Philip: One of the ideas precisely in the config syntax is that if you have an option like set, you see the first line, set mode line compact long. Long is a symbol. I just use regular read to read this, and it's not evaluated. There's an option down there somewhere, I think, eval set, where the format expression is an S expression that's evaluated to a string. So you have to opt into evaluation. which seems more intuitive to me for a regular configuration when you're writing it, because all these things... Like, I have to think about quoting. Then there's the issue like with with-eval-after-load... Can I customize this variable before the package is loaded, after the package is loaded? If it has, like... If you're adding something to a list and the list has a default value that you don't want to set the value of the default, don't want to add it to the list because then it's not loaded, and it could trigger a undefined variable signal. So these are other inconveniences that I don't, I personally do not see any value in teaching people or having people to deal with these sorts of issues before they have any broader intuition. Which is a very idiosyncratic take perhaps, but...

Prot: No, no, it's fair.

Philip: What I'm trying to get at is this sort of any configuration syntax would be something that a UI could generate a lot easier and in a way that wouldn't have this artificial split between your own personal handcrafted configuration and the generated part of the configuration. Mechanically changing this, finding the section package avy, because it has all of these primitives which didn't exist early on in Emacs, like packages and features exist and so on. The sort of structure which use-package usually provides.

Sacha: I have about one minute before the kiddo starts on lunch break, so I'm going to interrupt a little bit and do a quick summary. But the two of you are welcome to keep hanging out and chatting. I'll leave the Big Blue Button room open. And if you want, I can set it up so people can join you, depending on your time, et cetera, et cetera.

1:00:21 Quick summary

Sacha: But basically, what I'm getting for a quick summary of the conversation: Emacs 31: the newcomer presets is work in progress. People are definitely open to improvements, ideas, other suggestions for other features. The kiddo is just running out now. I will put the chat in the thing.

Prot: Yeah, of course, of course. That's fun. So, what's happened?

Sacha: Do you want me to open up the chat to everybody? Or do you have other things?

Prot: Me, I can stay for another 20 minutes. Just to say I can stay for another 20 minutes because then I have to take the dog.

Sacha: Yeah, and Phil? Oh, you have to leave.

Philip: 20 minutes is fine. 20 minutes is fine for me as well.

Sacha: Okay, okay. I will put the thing in the chat and people can continue because the kiddo was like, ah! Okay, yes.

Prot: Okay, okay, okay. Good. So, yeah, of course, there is a chat going. Yeah, let's see. So, Sacha, you will link it there. Ah, nice.

Philip: So, I presume there has been an idea of people watching this.

Prot: So this is live.

Sacha: And I can copy the chat thus far since we didn't even get to any other questions. Hang on a second. Where am I even?

Prot: We're trying to deal with those, right? Yeah, yeah, yeah. Well, eventually to have a discussion and also take questions, eventually you need to have more time, I guess.

Sacha: Yeah, yeah.

Prot: But thank you all so much. Yeah, yeah, yeah. That's good. Yeah, yeah. Thank you, Sacha. Thank you very much. And of course, the kiddo overrides all.

1:02:27 Continuing with INI

Prot: That thing with the INI, I think it's very promising. I mean, if you flesh that out. Because the other thing is, yeah, yeah, with the INI configuration, because what would be, though, the fate of what is now added, you know, when you modify something and it adds this, you know, this has been set by custom, do not touch it kind of thing. You know what I'm talking about, right?

Philip: Yeah, you mean the generated user glob. Well, my idea, or if I were, if I had the time /motivation/whatever to flesh this out, because currently it works... Currently it's an actually existing Elisp file which you could use, but I think it would be most interesting if it would be upstreamed. It would sort of be like, if you don't have a .el file, Emacs would look for it .ini file, or emacs.ini file or something like that. Then, of course, you can check, like, does the INI file exist or does the .el file exist? Probably there would be a user option to select into which it would inject the new options. And by default, it would select, for example, if the INI file exists, then it would use the INI file. But there is some controversy to this, because I totally understand the sentiment we're coming from with... You're using Emacs, so you have to learn Lisp. But for me, the bar is a bit higher than just the inconvenience of writing out this more or less. It's, as Joel Sussman referred to it, this ritualistic Lisp. You always have to repeat the same stuff all over again, like with eval, afterload, set. add-to-list, then you have to quote the option in one case. And if you change something in a map, then you don't have to add it. And of course, if you know Lisp, then you know that in one case, a keymap is a cons cell, so you're actually modifying the rest of the cons cell. That's why you don't need to quote it. But in the other case, you're accessing it via symbols, so you need to quote it. But this is all technical details. There's no necessity in it. It doesn't have to be that way.

Prot: Yeah, yeah, yeah, that's fair, that's fair, of course.

1:04:42 Motivation

Philip: One thing I wanted to bring up in the discussion when we were talking about reverence was there is, I mean, one part of the thing that gave me the motivation to go through with learning Emacs, even though I didn't use the tutorial initially, was sort of a reputation I heard about Emacs. And the videos I saw, wow, you can do these cool things. And this motivation, this image I had of Emacs help me go through, but if you overshoot this approach, then people expect too much in the beginning and are disappointed in the end and don't pull through. There's this question of having, how's it called, the ??... How to motivate people enough to be interested in Emacs, to actually learn it, but not to oversell it. If you give some sort of a demo of using Emacs, which is simply not representative of how it actually works, then that's something which would backfire. But I guess we can take a look at the questions, right? Yeah, let's see. Let's see.

Prot: Yeah, yeah, yeah. So yeah, I didn't read them.

Philip: I had the chat open, but I didn't have the time to read them. Sorry? I'm not sure how to parse these. Is this from top to bottom?

Prot: I guess from top to bottom is how they arrived in the chat. The top is the earliest.

Philip: The usernames are mentioned below.

Prot: I guess that's a copy-paste thing. Yeah, yeah, yeah. So there are some...

Sacha: I gave the kiddo some packed lunch, so I'm back.

Prot: Oh, hello there!

Philip: We were just wondering about how to read the comments you posted. Maybe you have a better UI.

Sacha: I pasted them into the chat. So in the Big Blue Button...

Philip: But that's the order of occurrence?

Sacha: That's order of occurrence. It's totally not very... It's just like a big paste.

1:06:50 Politics and philosophy

Prot: While you read it, let me... Yeah, there is a comment there from LC2000 about the splash screen having a lot of emphasis on the legal side, which is a fair comment. I think the legal side is important though, because of course, free software and all that, but of course, it could be rearranged. So maybe you don't want to have it at the top front and center, you want to have it further down. Maybe. I don't know. I don't have a strong opinion, but I think the legal side is it should be there at some point. I feel like it's a political minefield though.

Sacha: Just leave that alone. 200 comments on emacs-devel. One of those really long threads.

Philip: I cannot under-emphasize how surprised I was when my suggestion to add a checkbox on the splash screen just went through. Because I expected people to object, no, we can't add it there because of some system. It wouldn't look the way it should look and that would be confusing or whatever. But apparently change is possible. You have to be careful and be patient.

Prot: And I guess here there is an assumption, right? There is also an assumption that people will attack you or be unreasonable. And I think this is not true. You mentioned it earlier as well. Eventually you have to get on the mailing list because people, if they don't hear the opinion, the counterpoint, they will never know what to do with it.

Philip: but it's not entirely unreasonable because there are discussions that can be... There are people on emacs-devel, it's sad to admit it, but there are people who voice strong opinions, like strong opinions, with no power behind them, which can scare people away because there's no... There are no tags. There's no index of people on emacs-devel, so you don't know if some John Doe responding to your message, if he's actually responsible for this and makes ae decision, or if it's if Eli is sending a message and his decision on the discussion actually weighs a lot more than other matters.

1:09:23 Experimenting with things outside core

Sacha: I feel like sometimes experimenting with newbie-focused resources, like the unofficial ones that are around... At least we can try the ideas out and then say, hey, here's the patch and also here's what people have been using it for, so you can see it a bit more concretely, than dropping an idea into the discussion and then having the whole bike-shedding happening without as much data.

Philip: That's seriously my main recommendation. If you want to propose something, add a prototype, add a patch, add something to narrow down the discussion. That's something people would take away from this discussion, from my experience.

Prot: I 100% agree. I think that's the way to go. Just implement something so that it focuses the attention. Otherwise, you will get those endless discussions very quickly.

Sacha: Or try it as a package first, and then it can be core.

Philip: Excuse me?

Sacha: Oh, I was thinking if it's possible to prototype something as a package, now that Emacs has made it a lot easier for people to install packages, then at least it can be tested before having all the conversations about whether it should be as part of core or part of the splash screen or everything else.

1:10:42 Extending the core

Philip: The counter tendency I feel obliged to mention is that many times proposing something as a package or as an extension to the core can actually simplify the implementation vastly. Especially if you need to make one or two twists upstream and you need something like an additional hook or something to exist upstream. If it's a package in the core, then it's a lot easier to explain why you have to make this change than having to deal with some sort of advice and changing a lot of things. There was a certain tendency during the mid-2010s, which I only know from history, was to re-implement a lot of stuff in logs, in packages, instead of working on them upstream. That created a lot of divergence between packages, and in my opinion, complicated things because it introduces this entire choice fatigue. Should I use Flymake? Should I use Flycheck? Should I use LSP mode? Should I use Eglot? Which is not a historically accurate example in the stats that I'm given, But I'm certainly in favor of at least considering upstream contributions.

1:11:52 Guide to contributing to ELPA

image from video 01:12:27.567Philip: Even like packages, of course, it's the way we recently published these guidelines, or not guidelines, this contribution guide to publishing packages on ELPA, which is on, if you want to open it in the browser, it's on the ELPA homepage, which lists sort of these hard criteria which we require from ELPA. Just elpa.gnu.org, yeah, it's... That's going to be a link to the page.

Sacha: Yeah, this is pretty recent.

Philip: This is recent, and then there's a list of suggestions. But this is getting off the actual point. I'm just saying that relating to the general point, my experience is that proposing something concrete but also be open to hearing the opinions of other people These are the two necessary but maybe not always sufficient ingredients to making the changing stuff. Because if you just say, I want this to be different but don't put in the work, then everyone's going to forget it. But if you propose something and then insist that it has to be exactly this way, then you're just creating social tension. Maybe missing out on interesting things.

1:13:11 Making the newcomer experience better

Sacha: And especially since people are using Emacs for so many different reasons and coming from so many different backgrounds, what you are very firmly committed to might very well work for one set of people, but will run into these issues for all these other people. So if we want to bring it back to this, you know, how do we make the newcomer experience better? It's great that in core, there's starting to be a little bit more infrastructure for supporting things like sets of reasonable defaults for people. And maybe we as a community need to figure out, all right, how do we write documentation around it? How do we make tutorial videos? How do we encapsulate, okay, this is what this typical newcomer experience is like for this set of people and maybe these options or packages or a glue code might be helpful for this group? Maybe.

Prot: Maybe. Yeah like in theory you can imagine of something like if you are a Python developer, here is your Python presets theme. If you are doing Org or whatever, here is your LaTeX and friends, right, and you could also have extensions like that in the future.

Philip: I mean nothing about the idea is... It could have been used as a package people can load otherwise.

1:14:30 "user option themes" versus "appearance themes"

Philip: And hopefully, as I said, there is certainly additional work which can be put in to support making user option themes better supported. I think one of the things that will be useful is actually referring to them just in nomenclature points as user option themes to distinguish them from.

Sacha: From themes.

Philip: From color themes, yeah. Color themes, yeah. We even introduced the distinction themes have kinds since like Emacs 20. 29, I think. 29. Yeah, yeah, yeah.

Prot: I think you did that, right?

Philip: I think I worked on a patch. But that was exactly, I mean, that was already where the seeds for the current theme were started, because we wanted to distinguish between these different kinds of things. Were there any other questions?

Prot: I don't think so. But yeah, as we saw now with the find-library that Sacha did in the beginning, it would be nice to also eventually be able to find the theme or whatever. Maybe it's a different find-theme, if for whatever reason it cannot be find-library.

Philip: That's actually no reason why that shouldn't be the case. I mean, you could just extend the logic to not only consider the load-list, but also the... Whatever the variable is for the list, then it should be able to find that as well, even though it's strictly speaking, that's a library. But that's a decision that someone has to make at some point or convince someone.

Sacha: I think find-library does work for it. Like, find-library will find it only if it's loaded. And then since I can't, like, undo it...

Prot: If it's a package.

Sacha: Yeah, yeah.

Prot: If you install it as a package, yes.

Philip: Because then the theme is in a directory which package.el has added to a load list. I think the preset, if my memory serves me correct, then find library only looks through load-path.

Sacha: I see, I see. And etc/themes is not in the load-path.

Philip: Exactly. Because these aren't, this is, I don't know why. It's not...

Sacha: Okay, all right. That's another message to emacs-devel.

1:16:49 configuration generator in Emacs? maybe more wizards?

Philip: It's the sort of annoyance which from my perspective is so inconvenient that I forget it every time and then you don't change it.

1:16:59 Starter kits

Sacha: @brongulus says the Doom Emacs module approach is very nice for beginners and entices them to get into things more. People interested in a certain common set of functionality can get an opinionated starting point in Emacs, rather than worrying about what to install. And someone else in the previous That's sort of like the theme approach, isn't it? Sort of, yeah. It's not just, hey, these are the packages and you can comment and uncomment lines that load the different modules, but also here's the glue to sort of start to make some of them work better together or to change them to reasonable defaults.

1:17:39 Configuration generator in Emacs Lisp?

Sacha: I was wondering, actually, along those lines, any thoughts about making your configuration generator type thing in Emacs?

Philip: The reason I, in the configuration generator, did not implement it in Emacs was precisely due to if it were in Emacs and would use, for example, something like the widget library and there would be these fine UI discrepancies which people wouldn't expect to behave the way they do, then scrolling doesn't behave exactly the way they expect it to do. But there has been an idea, I think, when I mentioned the configuration generator the first time. It was the notion of having actually a shared file format behind it, just some S expression, which could be loaded by both the configuration generator and a generic configuration wizard, which could also be used like every package could define their own configuration wizard for asking the user selected options and configuring these.

1:18:40 extending the archive format

Philip: That's also another thing in Emacs 32 which I plan to work on, to extend the package archive format. Among other things, allowing for multiple packages to be listed in it, because GNU ELPA and NonGNU ELPA both store multiple versions of all packages, but you can only install the most recent one. That's why pinning doesn't work. Absolutely no technical reason why this shouldn't also list other versions as well. And then you could have pinning without having to use Git. Packages as well. And there are a few others. There was a thread I think earlier this year where I collected a number of these extensions for the archive formats which could be extended. And now I forgot my thread. Now I lost my thread of those.

Prot: But basically extending package.el and the archive, yeah.

Philip: Specifically the archive, so that

Prot: Showing the previous versions which are already listed, like you said.

Philip: Yeah, so that you could pin the version so you could install the version. I honestly do not remember what I was saying just a few seconds ago, which is embarrassing. Okay, that's another problem.

Prot: Things happen, no worries.

Philip: You were talking about Doom Emacs?

Prot: There was a comment about the Doom Emacs and specifically the fact that there are these modules and you can load the module without thinking specifically about the packages. But then Sacha told you about your package configurator wizard.

Philip: Package configurator wizard and then extending the metadata could also include this sort of configuration option. So that packages, in some sense, could specify what options the user would primarily be interested in and what order they should be traversed. And you could have some sort of dependency, of course. This is some effort which has to be put in, but it's not something that's unreasonable, from a technical perspective, from implementing this. And it would make, I think, it could make, if you have the infrastructure for that, that would make installing and using packages a lot nicer. It sounds very promising, for sure.

1:20:56 User interfaces

Philip: The UI question remains the thing. Do you want to reuse the Customize UI, which has its historical warts? Of course, can they be ironed out? That's a different question. Or do you reinvent something from scratch? And I'm usually not that big of a fan of reinventing the UI. I'm more in the reuse existing interfaces, just into the back end.

Prot: Plus, if you were to invent a new UI, you wouldn't have this new feature already because you have too many things that you need to implement. Whereas just using custom UI allows you to just implement the feature and then the interface, maybe it's something that somebody else will work on or you work on at the latest.

Philip: Yeah, but then, of course, that's... Even if that is the case, then you have to make sure that you don't make assumptions that depend on your own customizer in the future. It's a whole list of dependencies which is just complicated.

Sacha: That sounds like a newcomers presets to un-wartify Customize, a reset theme to put the warts back on as needed, and then we can use the slightly more modern interface for the things that we had...

Prot: I think just to say this, but of course everything we have covered thus far, always we have to state it. Newcomers with an asterisk, right? With the caveat that you still have to put in the work, read the manual, be patient, all that, right?

Philip: Ideally, it would be nice if you could even start without it. I mean, I started without it, but it took me three or four years to actually write this one. I didn't want to write defun. I thought, what? I don't write my own functions. I just want to set options, which was wrong and appealing to this. That was the point from the beginning. But I think, Sacha, you wanted to close there.

Sacha: Oh, I just wanted to acknowledge that we are coming up in the 20 minutes that you said you were available for. Yeah, yeah, yeah, I need to go. Yeah, yeah, the dogs and everything.

Prot: Yeah, yeah, I have to take them for a walk because I have a meeting afterwards.

Sacha: Right. I wanted to thank both of you. I really like this conversation and the heads up and the interesting things coming down the pipeline. So thank you for that. We're going to continue, I think, working on the user experience for newcomers. which will probably be a mix of documentation and packages and other experiments and occasional email to emacs-devel suggesting things like the find-user-init-file and whatever. But thank you so much to you and to everyone who's tuned in.

Philip: You're welcome.

Prot: Thank you. Thank you. Thank you.

Philip: Take care.

Prot: Take care. Bye-bye. Goodbye, goodbye. Where do we close from here?

Philip: I'm just going to close the tab. Bye.

Chat

  • protesilaos: ​​Hello folks!
  • MichaelVash7886: ​hi
  • protesilaos: ​We still have a few more minutes. Looking forward to it!
  • MichaelVash7886: ​ended up starting on doom and the nice thing is anything I want to try out is either in there or it's a simple tweak away. but it's several layers of abstractions to change certain things
  • MichaelVash7886: ​for me to go from using doom to being able to program with a vanilla emacs I know it's going to be a journey to get things like completion, eglot, etc all setup
  • MichaelVash7886: ​also looking at moving away from evil to using something like Meow and vanilla emacs binds
  • lc2000: ​​Speaking of splash screen, there's still plenty of room, why not inline the GPL, and a small essay. Kidding of course, but what of slaying that sacred cow…?
  • lc2000: ​(As it stands, it prioritizes ideology, laywer-mandated stuff from before case law, credits, funding via manual ordering… and if new users don't recoil some things they may actually need/want.)
  • takoverflow: ​​Hello Prot, Sacha and Philip!
  • takoverflow: ​Thanks for this discussion
  • RandCode: ​​greetings, everyone!
  • RandCode: ​​emacs has a place for chatting in all of irc, matrix, xmpp and telegram room! (also email)
  • lc2000: ​​Packages are great at bundling functionalities, but Doom/Spacemacs/etc also fix the multi-package integration "glue", which technically could be packages (see all prior "config modules" attempts…).
  • sachactube: ​​https://bbb.emacsverse.org/rooms/chat
  • protesilaos: ​Come join us :)
  • lc2000: ​Probably best to talk of modern de facto "standards" (vs full CUA as then-defined), e.g. if there's a "region" new users expect C-c (or C-c C-c in anger) to work, and idem C-x/etc - easy wins maybe.
  • brongulus: I do prefer the idosyncracies of with-eval-after-load and actually explicitly binding and creating hooks, rather than relying on use-package is that it tells me explicitly the order in which things would be evaluated. In contrast to use-package where I would have to know about defer and how to properly define the order of loading of different packages.
  • Protesilaos: @brongulus Fair point! I also like it. The thing with use-package is that you understand it better if you know what it does under the hood.
  • brongulus: This is where the doom emacs' module approach is very nice for beginners and entices them https://github.com/doomemacs/doomemacs/blob/master/modules/README.org
  • brongulus: People interested in a certain common set of functionality can get an opinionated starting point in emacs rather than worrying about what to install
  • brongulus: This is how it looks https://github.com/doomemacs/doomemacs/blob/master/static/init.example.el
  • brongulus: Thank you for the meeting o.

Some types of new users to think about

  • Non-programmer interested in using Org Mode for notes and task management
  • Researcher interested in publishing, reproducible research, literate programming
  • Programmer interested in coding with Emacs
    • Coming from VSCode
    • Coming from Vi
  • Programmer still using a different IDE, just interested in Magit
  • Long-time Emacs user who hasn't explored Emacs Lisp

Sketching out their learning journey

  • Install Emacs
  • Use Emacs via the menu bar and toolbar
  • Get a little overwhelmed
  • Use M-x to call commands by name
  • Learn how to set up completion
  • Use some keyboard shortcuts
  • Figure out how to learn and connect
  • Customize some options
  • Eureka!
  • Define their own keyboard shortcuts
    • Challenge: init file
  • Define their own functions
    • Challenge: Emacs Lisp

Other notes

Learning how to modify Emacs with Emacs Lisp can help people really appreciate its power. For example, you need Emacs Lisp to set your own keyboard shortcuts. You can't set them through the Options menu or the M-x customize interface. One challenge is that the Emacs Lisp configuration file that is loaded at the start of every Emacs session might be in one of several places, which means that in order for newbies to understand how to add something like:

(bind-key "C-c r" 'org-capture)

we need to either include a link to something like EmacsWiki: Init File, or repeat the instructions and the troubleshooting steps in beginner tutorials.

  • user-init-file defaults to .emacs for new users if none of ~/.emacs, ~/.emacs.el, ~/.emacs.d/init.el, and ~/.config/emacs/init.el exist.
  • After you select newcomer-presets from the splash screen, this is not persisted automatically. "Options > Save Options" doesn't save it either. Because people usually think of themes as cosmetic, they're not likely to find it under "Options > Customize Emacs > Custom Themes; newcomers-presets; Save Theme Settings." The "Options > Save Options" will save the change that newcomers-presets made to the tab bar, thus creating a ~/.emacs.
  • https://doc.emacsen.de/gallery.html - gallery of themes built into Emacs

Some screenshots of a fresh Emacs

2026-05-12_08-59-17.png
Figure 1: The splash screen for a new Emacs
2026-05-12_09-01-50.png
Figure 2: File menu
2026-05-12_09-02-43.png
Figure 3: Customize menu
2026-05-12_09-03-37.png
Figure 4: Help menu

Trying pkal's Emacs Configuration Generator

Emacs Configuration Generator - old source code, site is no longer live

sbcl --load ecg.lisp --eval "(ecg:start)"
2026-05-13_21-36-30.png
Figure 5: Web interface
2026-05-13_21-37-11.png
Figure 6: Theme preview, other options

Sample generated configuration:

;;; Personal configuration -*- lexical-binding: t -*-

;; Save the contents of this file under ~/.emacs.d/init.el
;; Do not forget to use Emacs' built-in help system:
;; Use C-h C-h to get an overview of all help commands.  All you
;; need to know about Emacs (what commands exist, what functions do,
;; what variables specify), the help system can provide.

;; Load a custom theme
(load-theme 'modus-operandi t)

;; Use whatever the default monospace font is
(setq font-use-system-font t)

;; Miscellaneous options
(setq-default major-mode
              (lambda () ; guess major mode from file name
                (unless buffer-file-name
                  (let ((buffer-file-name (buffer-name)))
                    (set-auto-mode)))))
(setq confirm-kill-emacs #'yes-or-no-p)
(setq window-resize-pixelwise t)
(setq frame-resize-pixelwise t)
(save-place-mode t)
(savehist-mode t)
(recentf-mode t)
(defalias 'yes-or-no #'y-or-n-p)

;; Store automatic customisation options elsewhere
(setq custom-file (locate-user-emacs-file "custom.el"))
(when (file-exists-p custom-file)
  (load custom-file))
View Org source for this post

Trying out Kanata for one-shot modifiers and home row mods on Linux

| linux

Prot is a fan of one-shot modifiers. I started experimenting with them using keyd, but now I've moved to using kanata based on his recommendation. I also want to experiment with home row mods so that I can hold down:

  • f or j for shift
  • d or k for control
  • s or l for alt
  • or a or ; for super.

(Based on QWERTY home row, although Xmodmap translates it to Dvorak, where my home row keys are aoeu and htns.)

Here's my config:

  (defcfg
    process-unmapped-keys yes
  )
  (defsrc
  grv  1    2    3    4    5    6    7    8    9    0    -    =    bspc
  tab  q    w    e    r    t    y    u    i    o    p    [    ]    \
  caps a    s    d    f    g    h    j    k    l    ;    '    ret
  lsft z    x    c    v    b    n    m    ,    .    /    rsft
  lctl lmet lalt           spc            ralt rmet rctl
  )

  ;; define values for tap time and hold time
  (defvar
    tap-time 100
    hold-time 200
  )

  ;; alias definitions
  (defalias
    a (tap-hold $tap-time $hold-time a lmeta)
    s (tap-hold $tap-time $hold-time s lalt)
    d (tap-hold $tap-time $hold-time d lctrl)
    f (tap-hold $tap-time $hold-time f lshift)
    j (tap-hold $tap-time $hold-time j rshift)
    k (tap-hold $tap-time $hold-time k rctrl)
    l (tap-hold $tap-time $hold-time l ralt)
    ; (tap-hold $tap-time $hold-time ; rmeta)
    osshift (one-shot 60000 lshift)
    osctrl (one-shot 60000 lctrl)
    osalt (one-shot 60000 lalt)
    osralt (one-shot 60000 ralt)
    osmeta (one-shot 60000 lmet)
  )

  (deflayer base
  grv  1    2    3    4    5    6    7    8    9    0    -    =    bspc
  tab  q    w    e    r    t    y    u    i    o    p    [    ]    \
  @osctrl @a    @s    @d    @f    g    h    @j    @k    @l    @;    '    ret
  @osshift z    x    c    v    b    n    m    ,    .    /    @osshift
  @osctrl @osmeta @osalt           spc            @osralt _ @osctrl
  )

I followed the systemd instructions, so things should be loaded when I restart. To reload my config, I use C-c C-v C-t (org-babel-tangle) and then call systemctl --user restart kanata.service". Or actually, I have an Org Mode link of the form

[[elisp:(progn (org-babel-tangle) (shell-command "systemctl --user restart kanata.service"))][Update config]]

so I can just activate the link and have my new definitions loaded.

Resources:

View Org source for this post

2026-05-11 Emacs news

| emacs, emacs-news

People are getting Emacs 31 ready for release. Looking forward to that! See emacs/etc/NEWS.31 for details.

Lots of posts for the Emacs Carnival theme of "May I recommend…", yay!

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

Emacs Chat 22: Shae Erisson

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

: Transcript, yay!

I chatted with Shae Erisson about Emacs, keyboards, Org Mode, and life.

View it via the Internet Archive, watch/comment on YouTube, read the transcript online, download the video / MP3 / transcript, or e-mail me your thoughts!

Chapters

  • 0:07 Intro
  • 1:01 1999, IRC, community building in Haskell
  • 2:02 Emacs as a light-weight build-your-own-editor toolkit
  • 2:55 LSP, treesitter, Magit, jujutsu, C++, Python, Haskell, rust
  • 3:38 how does a new person experience Emacs? Emacs is always fun.
  • 4:07 Markov keyboard project, moving to Finland, right-handed Dvorak, split keyboard; Jeff Raskin; I am not a koala
  • 6:45 Purpose-specific function keys
  • 7:34 Trackballs, scroll
  • 8:17 1" trackpad rings
  • 8:58 Pair programming: ttyshare, shwim
  • 13:20 Recurse Center, "What is that keyboard? What is that editor?!", Emacs bankruptcy and starter kits
  • 16:09 hippie-expand
  • 17:18 yasnippet
  • 19:01 Function keys
  • 20:05 Org Mode
  • 21:17 Show Org agenda when idle
  • 22:03 Programmers want flow. When programming, light turns red
  • 24:27 ef-themes and modus-themes, season
  • 25:58 htmlize (does this still work on Wayland?)
  • 26:40 lsp-ui-imenu, jumping through rust code
  • 28:30 laptop with 126GB of RAM
  • 29:48 LSP coolness, Haskell, treesitter
  • 32:02 Combobulate
  • 32:52 What else are you using your 126 gigabytes of RAM for?
  • 33:27 TalonVoice
  • 34:46 NixOS, following Steve Purcell about 5 years behind
  • 35:06 envrc
  • 35:54 time-tracking
  • 37:05 taxes with Org Mode, remote lookup
  • 41:02 finding notes with C-s
  • 42:38 Org Mode, managing inbox
  • 46:30 Timestamps
  • 49:14 Org timers
  • 53:56 Org Mode snippets
  • 57:16 Compilation finish function: handle success

Transcript

Transcript

0:00 Intro

Sacha: Okay, so I'm going to actually remember to hit go live. I've got a 10 second delay, so if we need to panic, we can panic. Okay, so let's see. I think we are live. Hi, everyone. This is Emacs Chat number 22 after a long hiatus. And today, I'm here with Shae Erisson, who is also like an Emacs friend from a long time back. So this is it. As you were just saying, this is the first time we're actually talking live. And I'm looking forward to hearing about your configuration, how you use Emacs, Shae. But before we dive into that, can you give us a little bit of context? Who you are, what sorts of things you do, and how you use Emacs for that?

0:57 1999, IRC, community building in Haskell

Shae: I would say that... I guess I started using Emacs in 1999 when I moved to Finland. And I remember about the same time I was on IRC and I was really frustrated. I remember I got on the Perl IRC channel and I was like, hey, I want an editor that has syntax highlighting. I want to see colors to these words when I'm typing them. And they were like, noob, and they kick-banned me. And I was like, well, maybe I don't want to learn Perl, which I never did. And I guess that was an early introduction into I wanted to be part of communities where people were sharing positive things and building up each other. Actually, I ended up starting the Haskell IRC channel a couple of years later, and that became a very big thing. I would say that I'm mostly known for my work in community building in the Haskell programming language community, because I did that for, I don't know, 15 or 20 years. But I really like Emacs.

1:58 Emacs as a light-weight build-your-own-editor toolkit

Shae: So like last week at the same time I had the standing chat with a friend of mine who is also a programmer and he said oh so you're going to do this thing in a week do you want to give me like a preview of the talk and I was like yeah I guess so and some of the things that were really interesting was he was like I've never really tried Emacs I don't know much about it I kind of have this impression that it is a very lightweight build your own editor toolkit and I I was kind of taken aback because, you know, I guess I still have this long ago and far away. I don't know if you remember 8 Megs and Constantly Swapping is what people used to call Emacs and things like that. And I was, it was just kind of, I realized I'm still in my little echo chamber. And this is why I like to talk to other people all the time is because I want to have some exposure to what other people are doing.

2:51 LSP, treesitter, Magit, jujutsu, C++, Python, Haskell, rust

Shae: I guess things about Emacs that really changed stuff for me is language server protocol, TreeSitter. Those, I think, are two very powerful tools that are much more generic than, I mean, Magit, of course, is like magic. Although I've mostly switched to jujitsu lately instead for the last year. Let's see, I had, I guess, let's see, I did C++, I did Python, I did a whole lot of Python. And then I had Haskell jobs for five or six years. And then I switched to Rust about a year and a half ago. I now have a Rust job. And one of the things that Prot had asked, I think, or you had asked, and I forget exactly how this went.

3:35 how does a new person experience Emacs? Emacs is always fun.

Shae: It was great fun watching your livestream. And it was, how does a new person kind of get comfortable with using Emacs for a particular purpose. And I look for things, in fact, like how do I use Emacs for Rust, Rust development? And I found a couple of good guides on, and I was able to follow most of them, although my Yesnitit stuff is broken and I don't exactly know why tab doesn't work, right? But, you know, like there's always, Emacs is always fun, right? There's so many cool things you could do with it.

4:03 Markov keyboard project, moving to Finland, right-handed Dvorak, split keyboard; Jeff Raskin; I am not a koala

Shae: I noticed, I actually hadn't seen your preview page and I noticed that you found my Markov keyboard.

Sacha: When you say Emacs is fun, I'm reminded of all of your fun, crazy keyboard experiments. It's like, what? I have a feeling you like to tinker with things.

Shae: Yeah, so I think actually the influences as to how I got to where I am are pretty interesting. So the person that I ended up moving to Finland to for dating her, we started a company, we did projects, and I was the programmer. We had this pretty big project. I guess it was like 350,000 euros. And I mean, that was going to be over four years and we had to kind of complete the whole thing, and I was the programmer and we'd had the lowest bid... I had an IBM model M, you know, the super clicky with like all the... And about three years into it, my arm started really hurting a lot. But I was the only programmer. And nobody else knew all the code. And we had to ship it, because that's how we got paid. And so I ended up pushing through. And at the end of it, my arm just didn't work anymore. So for about a year and three months, what I did was I actually taught myself to type right hand. ...Dvorak, because I was already using two-hand Dvorak, and so I kept programming, but I just... One of the things was... like, I like programming, I like using computers, I don't want to wear out my arms again, I don't want to blow them out, so I ended up switching to split keyboards, and I will show you. This is very much the kind of thing that I like to use, and that is like this.

image from video 00:05:44.800Shae: This is an Ergodox Infinity, but there's a lot of other keyboard flavors like this. And one of the things that I particularly like about this... So around the same time I met Jeff Raskin, who wrote the Inhumane Interface. And so for this particular thing, this is like Control and Alt and Hyper and Super and Shift. And this means that under one thumb, I have a lot more modifier keys than you get off of a standard. And it also means... A lot of my problems started with Emacs pinky, the dreaded, the infamous... I think that one of my... I made a keyboard layout called "I am not koala." You may not know this, but koalas have two thumbs. They have one on each side. And that's cool, but I don't have two thumbs, and I realized that when I was trying to grab something, I didn't put my pinky on it. That would be silly, right? I want to put my thumb around it. And so I decided I would move all of my chording keys under my thumbs. And that's kind of how I...

6:43 Purpose-specific function keys

Shae: And another thing I did was when I was really only able to use one hand, was I made my function keys mostly purpose-specific. And that was from Jeff Raskin's writings in The Humane Interface. So I guess I'm a programmer who really likes writing code, doesn't want to wear out my arms, and likes to do fun keyboard things, yeah.

Sacha: Definitely. You're in it for the long term. You don't want to use up all of your arm capacity now and not be able to keep programming in the future. And now there's hardware to make that easier. So I'm glad. Split keyboards with extra thumb keys seem to be very popular in the Emacs community. I'm now tempted to find space in my desk in order to make that happen.

7:30 Trackballs, scroll

image from video 00:07:37.067Shae: Another thing I ended up switching to was I started using trackballs. Oh yeah, yeah. I tend to go completely overboard when trying out new things, so I bought 20 different models of trackballs and ended up settling on this one. The nice thing about this one is that this is how you scroll, and it has four buttons.

Sacha: That is really cool. I like using ThinkPads, so I've been just living off the tiny little mouse in the middle of the keyboard. But back in the day, I also used a trackball. If I can get to the point where I want to take my hands off the keyboard again in order to do mouse things, that would probably be the direction I would go.

8:14 1" trackpad rings

Shae: I had an experiment in that area, which is where I purchased a one-inch touchpad, and I strapped it to my finger. And it was a PS2, and it had a USB converter plugged into it. And the idea was I could keep typing, and then I could move the mouse around without taking my hands off the keyboard. And now they actually have touchpad rings. They came out six months or a year ago. It's relatively recent. But the idea is no change in context.

Sacha: I've only seen the scroll rings, but now there's a touchpad version. That is interesting.

Shae: Yeah, I think that's pretty cool stuff. Hardware is actually improving things.

8:54 Pair programming: ttyshare, shwim

Shae: Oh, another thing, one of the things you talked about with Prot was how do you learn other people's stuff? And one of the things that I use for pairing, so I have one coworker, and it's a strange, interesting job. I like it a lot. And I met this coworker at a previous job, and one of the things, let's see if I can find it. So we used to, at the previous job, we used this thing called ttyshare. Have you heard of it? ttyshare. It's great. You can run it in a terminal and then you can effectively share your terminal with someone else. And so you have multiplayer terminals and that's neat. It was kind of a pain to set up. You had to make sure that you weren't NATed, you know, like you had to have effectively... someone had to have a public IP. You had to do a couple of other things. And as part of my job, I'm now, I guess, part maintainer for Magic Wormhole, the software.

image from video 00:09:58.467Shae: And so one of the things that my coworker wrote was this nifty thing called ShWiM. And it's basically "shell with me." And it's a wrapper around TTY share so that with one single command, you can share a terminal. And the way that we use this is... We both run Emacs as a server, and then we use emacsclient in the terminal to connect.

image from video 00:10:41.967Shae: I don't know if you've ever done this, but I can have a terminal right next to this, and if I run emacsclient in a window, then I'm sharing the same thing. This is a graphical chat with Sacha, in the terminal or in the UI, and both of them are updated.

Sacha: That's fantastic. I remember people were using tmate for something similar before where you could share that. But yeah, it's just making it seamless, making it frictionless. And on the other side, I have also just been using wormhole to send large files back and forth between Karthik and John Wiegley because we have this other Emacs chat thing where we're going to post it eventually, once I finish figuring out how to redact all the personal information and Org files. But yeah, it's great for being able to send things without having to worry about, oh, you know, what's my public IP? Can I tunnel all the different things to get past whatever firewalls there are? So if this also works for terminal things plus Emacs client, that sounds really, really exciting.

Shae: We've tried some other experiments. One of the things we tried to do was, and the only downside is like, what if my terminal has a different size, then you have to kind of shrink and match. And so we tried to honestly directly bridge to Emacs clients. And because I don't know if you're aware that there's effectively a local socket for the Emacs client that you can have multiple things connect to. But it turns out there's some sort of like system so I couldn't like reach across the network and directly use my co-workers Emacs session and he couldn't use mine. Weird things happened when we tried to do this cross host. As far as I can tell the Emacs client only works in the same host.

Sacha: That's interesting. Lately, I've also been experimenting with CRDT, which has that Emacs-less plant as well. So that's been nice. But yeah, of course, a lot of people will be kind of stuck with the first challenge of finding someone that they can pair in Emacs with.

Shae: I understand. And I think I'm honestly very happy that my one single coworker at this job is also a big Emacs user. And so we exchanged cool ideas and worked on stuff. And I'm very happy about that.

Sacha: Were they already an Emacs person before they joined? Or did you pick the coworker because they were an Emacs person?

Shae: They picked me. They were pretty much the person who started this thing. And they picked me because they'd worked with me at the previous job. Although I did have an experience like that. I had this massive Emacs config file, like 20,000 lines, and half of it was comments because it had accrued over 20 years.

13:13 Recurse Center, "What is that keyboard? What is that editor?!", Emacs bankruptcy and starter kits

Shae: And in 2019, when I first went to the Recurse Center, well, my first batch, I just was extremely extroverted and social. But my second immediate following batch, which is not the common pattern, I was like, okay, my goal is to write a bunch of Haskell, get some Haskell jobs, And so I went to the quiet room on the quiet floor. But then someone else came in, Marianne, my favorite programming friend. And she was like, what is that keyboard you're using? And I was like, ah, this is an Ergodox thing. And then she's like, what is this editor you're using? And I was like, oh, that's Emacs. And I was kind of a grumpy, like, I'm trying to get stuff done. But she was persistent. She was like, show me this thing. And so I was like, I'll show you Emacs. And she was like, this is great. And I was like. This thing? OK, cool. And I was like, I don't think you want my config. You'll probably want a starter kit. And she was like, well, what are starter kits? And I was like, well, I've heard about Spacemacs. I've heard about Doom. And I would try one of those. So she tried Spacemacs. And I guess this next part happened over several months. She tried Spacemacs. And then she was like, I like it, but it's slow. So I'm switching to Doom Emacs. And I would pair with her. And I was like, wow, look at all these cool things that the starter kits can do. I ended up flushing my entire 20-year-old config and kind of starting over and stealing a lot of great ideas from the starter kits. And Marianne is very ambitious, independent, hardworking, very focused. I'm not very focused. But I've learned a lot of things from her and watching her kind of... I haven't done C in Emacs in a long time so it's great fun to watch her learn these new things and then I learned stuff too and yeah it's good to have collaborative people to work with.

Sacha: So it sounds like if people would like to encourage more people to talk to them about Emacs, feel free to use your strange keyboards out in public.

Shae: I like that. That's good. That is good. Yeah I think that's reasonable.

Sacha: Yeah, and I've just recently started digging into the starter kits too, because I realized I don't know much about them. It is really interesting going through them and discovering all these Emacs 31 options that you can enable to simplify your config or improve your workflow and all that stuff. So there's a lot of good stuff in starter kits, even for people who are not newcomers.

Shae: I agree. And I think there's nothing wrong with just learning a bunch of new things, trying them out, and also throwing them away if you don't like them.

Sacha: Now that you've declared Emacs bankruptcy and rebuilt your Emacs on top of other people's starter kits, what has made it into your config? What have you kept from those 20 years of tinkering with Emacs that you really wanted to stick around?

16:06 hippie-expand

Shae: I think the only thing that has absolutely stuck around is my use of hippie-expand, which is, I believe, a very old... an ancient tool from a different time. Most of the other stuff is kind of gone. Gone to the wayside. But I really like, I honestly really like hippie-expand. And I know that like, I have rarely heard of other people who use hippie-expand. But you use it? I think you just muted yourself.

Sacha: I also vote for hippie-expand. It's a nice way to try different functions and just say, I just want all these different possible completions to go in there.

Shae: Yeah. The thing for me that really sold me on hippie-expand is that most of the time when I am... When I'm doing something, I want to say, like, I can already see that word, just pick that one. And so I'll type the first characters and hit, like, meta forward slash, and ta-da, it's usually there. But then sometimes I do really want, like, some Elisp or some other stuff. And so I actually spent a lot of time tuning this the first time.

17:14 yasnippet

Shae: I actually only changed it for the first time recently because I was reading a how to write Rust well inside Emacs and they said oh well you want to use yasnippet and so I you know the funny thing is that yasnippet I believe is the thing that got me into Emacs like in 1999 I met this Finnish person Erno Kuusela in Oulu, Finland. Really cool guy. I was like, wow, how do you do this? As soon as you open a file, it's got a substructure and a skeleton. And when you type part of a function or something, it just populates it. And he was like, I'm using this snippet command in Emacs. That's why I was like, what's Emacs? It was very exciting. And at the time, I was using Vim. And Vim was not as, I don't want to say, automatable.

Sacha: Yeah, now with Neovim and Lua, people are writing more extensions for it. But before, you had to know a lot of magic in order to customize Vim.

Shae: Right, right. I agree. Let's see, what else do I do? I run my own email server, and I, of course, read my email in Emacs. In GNU, no less. Which is, I know, an NNTP reader, but it's still also a great... I used to use twiddle compile and I think that stopped working like six years ago, so I need to get rid of this comment, but there's still a lot of kind of cruft from earlier times.

18:52 Function keys

Shae: Remember how I said that I use function keys to have like purpose specific stuff? This was especially true because, I mean, I had my left arm strapped to my chest for like a year and three months before I even started regaining any flexibility, and that meant that... I'm amazed that you could just map them directly to single commands instead of giving in to the temptation to make them prefixes for longer keystrokes. I didn't really have the choice because I had only one arm that worked. It was just a lot harder to do any chording at the time. I still have a lot of these. F3 I use a lot, which is like, oh, what am I working on right now? That is org-clock-goto. A lot of times, I want to have a terminal that's in Emacs, so that's vterm,

20:02 Org Mode

image from video 00:20:17.133Shae: And I actually really do use the calendar all the time. This is like just switch to whatever it is. Of course, my email is here. You know what, let's see... So this... I don't know, have you seen this before? Have you seen this thing called STARTED in an Org mode file?

Sacha: I use a STARTED state, yes.

Shae: Well, I got it from you! So if I look at like, my Org Mode configuration, a lot of this STARTED stuff I have from you, I don't know when, but you were the person who introduced me to it.

Sacha: It's the reminder that I did start working on this. I tend to get distracted by intermediate tasks, so it's nice to be able to say, try to finish these ones first before you move on to the next thing, maybe?

Shae: I agree. I have the same thing, yeah. And I keep meaning, because this is... I know that you can put Org Mode configuration into the first TODO item. I would really like to move it into the elisp and I just haven't gotten around to it. And it's been 10 years. I mean, maybe I should just do it.

21:14 Show Org agenda when idle

image from video 00:21:23.933Shae: One of the things I did that I found fun... I really have written almost zero Elisp, but I did actually puzzle my way through this a year ago. Since so much of my life is in Org Mode, I learned how to make timers. This is very close to what you get directly out of how to do timers in Emacs. After some amount of time, I want my Org agenda to pop up because I want to say like, oh, what is the stuff I'm supposed to be doing? And what am I forgetting? What has been scheduled? And what is on my to-do list? And I also like to look at what is the stuff I've been working on lately? And I really like that a lot.

21:58 Programmers want flow. When programming, light turns red

image from video 00:22:16.067Shae: Another thing that I realized is that I had a blog post that was wildly popular. Where did I put it? And it was all about Emacs. I don't know if you saw the... Here we go. It was... Ah, here it is. So here it is in... This is very much an Emacs...

Sacha: Oh, yeah, I remember that one. I put it in Emacs News. I thought it was great.

Shae: All right, cool.

Sacha: I would like the kiddo to sometimes be able to acknowledge this, but this is not happening. Still, yes.

Shae: Right, right. Yeah, and so this was really fun because, like... I had a friend who was in development and there was like millions of dollars spent on how do you detect whether a programmer is in flow and it came down to if they're typing they're probably in flow so and that was it because they tried to look at EGs and doing all kinds of other stuff but it was like if they're typing don't interrupt them. And I don't know, because I do so much in Emacs, I'm not sure how accurate this was. But basically, that's where I learned to do timers the first time. Or maybe... I don't remember which one I did first. And the idea then was as soon as basically my average typing into Emacs has gone up a certain amount, then it will actually switch to busy. And it works just fine. It was a lot of fun to write.

Sacha: So yeah, interesting use of getting the activity. I've seen other fun implementations of this. I think there's a c-c-c-combo package that makes some fun animation appear if you're typing really quickly.

Shae: Oh, oh, yeah. I'm guessing because I think Atom, the Atom editor had that for a while. I guess that's where it came from.

Sacha: So yeah, because you can instrument Emacs and play around with it, you can certainly do all sorts of things based on that information. Okay, so you've got it, you've got it set up so that when you come back to your computer, it'll show you the stuff that you've been working on. And when you're working on the things, you can tell it to tell the rest of the world not to bug you. Gotcha.

Shae: That's right. [Sacha: What other fun stuff do you have in there?

24:25 ef-themes and modus-themes, season

Shae: I discovered that I love the EF themes. I love the Modus themes. They make me very happy. They're just unreasonably pleasant. As someone who has tried every single Emacs theme ever, they're just my favorite themes.

image from video 00:24:41.000Shae: And so, at the moment, it's summer... Where did my summer go? How can this be? There we go. How come I'm in spring? Wait, isn't spring over? Hasn't summer just started? You know what I was thinking would be fun would be take the time of day, and you know that the EF themes has spring, summer, autumn, and winter, and I'm not sure if there are dark versions of each of those, but I thought, like I know that Modus themes will do this like check for the local time of when it turns dark, and then it will go from the light theme to the dark theme as soon as the sun hits, and I was like, well, what if I do that for seasons, you know, wouldn't that be cool?

Sacha: There's this subtle sense of change as you go through the year. But of course you also have this thing there where you just randomize it.

Shae: Well, I like that. Sometimes it's like I'm just kind of like, ah, I'm bored. I'm just bored of what I'm looking at. And so I will just change my thing. And it's just time for something. I don't know. It seems to work. It's like it gives me a little brain break from what I was staring at. And I did not know I was going to reset the effects scale, but that's fine. Interesting. What else do I have in here?

25:56 htmlize (does this still work on Wayland?)

Shae: Oh, Emacs HTMLize. I'm a little sad. I switched to Wayland. And if I remember correctly, HTMLize only works with, or maybe HTMLize still works, and it's the SVG one that doesn't work. Emacs SVG is a thing that if you're running with an X11 backend, you can turn your current screen directly into an SVG, which is really cute. It does not work in Wayland. I think HTMLize does still work. What other things do I have in here? I don't know. I guess a lot of it lately has been trying to make Rust things work smoothly. I've been trying to do some... I wonder does... Oh, cool. That was not what I expected.

26:37 lsp-ui-imenu, jumping through rust code

image from video 00:26:41.100Shae: I just started doing this thing with imenu. imenu integrates nicely with LSP.

Sacha: That is a very pretty sidebar thing, and I need to learn how to do that.

Shae: So because I have all these extra modifiers, my s-i is lsp-ui-imenu. And the reason that what I mostly use that for is when I have like a bunch of Rust code and I want to quickly jump through the structure of it. Basically that integrates with LSP, finds all the definitions, and I can quickly jump through it. I used to use lsp-treemacs for that, but lsp-treemacs puts things in its own order, not quite the same order I want, although treemacs is quite nice. I think that the thing to do is that you and I at some time maybe the next time if we do this again we should set up with a Shwim connection and you and I can both share our Emacs and then you can show me cool things that you do and I can show you cool things that I do and then we can start filing over some of the things. How about that?

Sacha: That sounds fantastic. I know we'd wanted to experiment with pair programming a long time ago so that sounds like a seamless way to do it. And therefore I will go and figure out how to install shim and get it working. I will probably need your help to actually test it. I don't know, I think I can rustle up. Maybe it'll work off my phone. You haven't tried that. But lspui, okay, so I've just been using straight up imenu, like on Neanderthal, but lsp-ui has this fancy grouping of things and colors and stuff, so I definitely want to check that out.

Shae: I'm a fan, yeah. I don't know. Do I have anything else exciting that goes with this in here?

28:25 laptop with 126GB of RAM

Shae: I will say that at the moment, the system I'm working on, I like buying unreasonably powerful laptops. And so, like, this system has 128 gigs of RAM and 24 cores. My previous laptop has 192 gigs of RAM. Long story short, I end up in a lot of cases where I want to use more memory. I've got all these cores. Can you do something with them? Perhaps you've already seen things like LSP doctor, which will say, have you tried this thing? Have you done this other thing? LSP has really changed

Sacha: I have not. Sorry, would you like to show me this LSP doctor thing? Because I have not ever seen it.

Shae: Yeah. Do you use language servers much for your development?

Sacha: I am only just getting used to having a relatively modern 2018 instead of 2010 laptop. And so I have the red squigglies and various things, but I don't know what to do with them yet.

Shae: Well, I mean, I'm doing a lot of this. So I have...

29:46 LSP coolness, Haskell, treesitter

Shae: Originally for me it was like I spent a lot of time with the Haskell language server because I was doing so much Haskell and it was a super powerful thing. In fact, somebody decided to hammer in half of a proof assistant into the Haskell language server and that was magic. You could do incredible stuff with that because you could just grab all of your local variables and transform the whole shape of your function and you could just write little snippets and just have it work. And that was amazing. It wasn't quite... One of the goals that I believe is... For future development of all programming editors, I believe that something like Emacs macros, but instead for abstract syntax trees, I believe this is an essential ingredient that we do not yet have. And I think that TreeSitter is the first step towards there. We now have one of the hats, right? Which is where we can take... TreeSitter is, you know, if you've used it... It is like you write some effectively C code to produce a really fast parser. Or is it like JavaScript that then compiles to C code? I forget exactly how it works. But the nice thing about TreeSitter is, I don't know if you remember, I'm sure you do remember, that if you were writing Python code and you used a triple-quoted string, you had to then add a comment with another quote because regular expressions is how Emacs was doing all the syntax highlighting. And honestly, that was kind of crap. And then there were projects like the Semantic Bovinator that made a full parsing suite in Elisp, which to me is half brilliant and half insane. And then there was TreeSitter, which kind of took over the world because it was... I think that the language server and TreeSitter are the first two of these editor generic pieces, and I suspect there will be more. I think that something where you can modify the abstract syntax tree and then put back to the source is one of those potential paths forward. I hope so.

Sacha: Yeah, that would be great if you could just do the manipulations and then roundtrip it back into source code. Just regenerate the changed part of your code. That sounds fantastic. So it sounds like you were able to do some kind of manipulation with the Haskell use case that you were describing. Any chance you can show us like the awesomeness?

Shae: Sadly, that sadly does not work anymore.

31:58 Combobulate

Shae: But you know, if you're looking for something in that area, have you heard of a Emacs library called Combobulate?

Sacha: I have heard of it. I haven't dug into it.

Shae: So it uses TreeSitter for source code manipulation by, and it's a lot closer to the way that like, you know, in Org Mode, you can like hold meta and arrow to kind of move things around. It uses TreeSitter to let you both move around in the context as well as actually alter the shape. And to me, this is the first step towards this tool that I want, which is where I can write a keyboard macro and have it edit an abstract syntax tree and then spit the results back into the buffer. Yeah.

Sacha: All right.

32:46 What else are you using your 126 gigabytes of RAM for?

Sacha: What else are you using your 126 gigabytes of RAM for?

Shae: Let's see. Honestly, I'm going to tell you that Rust Analyzer can take a lot of memory. And a Rust compilation can take a lot of cores. And I'm okay with that because I actually, I do like, and I will say that this laptop is actually from this year. So it's a brand new, like, top of the line. But then like, how would I, because I've got like, which I think is a bunch of matrix multiplication hardware. How do I use that from Emacs? I don't know. I'm sure I can find something, you know.

33:25 TalonVoice

Sacha: Maybe voice computing?

Shae: Oh, that's an idea. Yeah, one of my friends, she's using Talon. Have you heard of Talon?

Sacha: Yeah, I've heard of Talon. There are a couple of videos about people using Talon to code by voice, usually involving memorizing kind of a different alphabet for very quickly accessing different shortcuts. But it sounds really cool, and you sound like you've got the hardware to do something amazing with it.

Shae: That's true. Well, you know, Talon actually lets you do something very similar to Combobulate, where you can navigate the AST of your source code. You can kind of move around very quickly. I don't know, like, are we like at the end of our? No, no, we're halfway through, right?

Sacha: We're halfway through. I have about 28 minutes before the kiddo runs out and starts demanding lunch.

Shae: Okay, well, I feel like I've been driving the structure of our just kind of like dumping random things. Did you have any questions or anything you wanted to cover?

Sacha: This is all amazing. I come in with no preconceived notions. I'm just like, okay, shapr does cool things with Emacs. Let's hear about it. Let's go, let's go.

Shae: That works for me. Yeah. I mean, a lot of it's been focused on Rust development lately. Rust and Jujutsu.

34:45 NixOS, following Steve Purcell about 5 years behind

Shae: I've been doing a lot of Nix. I'm running NixOS. I don't know if you're familiar, but that's been great fun. It's funny, I feel like I've been following Steve Purcell around from a technical perspective. I'm always about five years behind Steve.

35:03 envrc

Shae: I was like, oh, you know, NixOS is kind of a pain with Emacs. And just like this, what was it, NixOS? I forget. Anyway, Steve was like, oh, well, have you tried my library, envrc? And I was like, what's that? And he was like, well, now each buffer can have its own envrc. And I was like, it's perfect. That's exactly what I need. Because previously, every time I switched buffers, it would then go load all of the local everything in Nix. And sometimes that could take a long time, especially if I'm doing Haskell, that could take 10 seconds, and I really don't want that sort of lag. And so Steve Purcell's brilliant library, envrc, says, you know what? Every single buffer can just keep such a thing, and then you can only relit it when you need to. And that's pretty awesome.

Sacha: That sounds cool, and I should check that out too.

35:52 time-tracking

Sacha: @JacksonScholberg has a question. He says, "I was curious about what you were tracking your time working on, how you track it." Is it just Org Clock? So this is how you keep track of the things you're working on and what got interrupted by the new thing that you just added to the stack and so forth?

Shae: Right. In fact, I have this thing. Honestly, when I sit down on my computer, Just clock in. You'll notice in the bottom right here, we have chat with Sacha, right? And so like, I just kind of clock in stuff. And like, I'm not always, I really kind of need to reorganize my Org mode files because I've been naming them per host because I previously had like a work Org mode and I had a home Org mode. now that my home hardware is also my work hardware I guess and so like I still have my previous laptops things where I'm keeping my events I really need to reorganize things but I mean yeah I schedule things I oh you know I've got a weird thing to show you

37:01 taxes with Org Mode, remote lookup

image from video 00:37:09.900Shae: I decided that it would be great fun to do my taxes.

Sacha: You are showing me your taxes, do I need to like black out this whole thing?

Shae: Well, this is actually just an example from the docs. So I could actually share my taxes on it because I mostly don't care. But I think in fact you can figure out exactly how much money I'm making by looking at the open whatever. So the thing about this is that I decided to file all of my tax forms directly into Org Mode spreadsheets and then do remote lookups. So basically each spreadsheet was one particular form. And then once I'd gotten to the bottom, like I need this result, like what's my estimated income? And then I would use the lookup, kind of this cross spreadsheet lookup. And that's how I did my taxes for last year. And then my de facto mother-in-law, she's an accountant, and she didn't exactly do this thing, but it was pretty close. She was like, you've got all your taxes in the spreadsheet. I was like, yeah. And then she looked at it and she was like, what is that? And I was like, anyway. So I got to kind of file everything back out into TurboTax, but that was a fun thing to build.

Sacha: Yeah, I have something like that too. So for example, whenever I do my tax paperwork, I just have to have like, you know, the step by step checklist. Okay, this is where I need to go to get this number. This is where I can put it in. And then eventually it spits out a table that says, okay, put this in box 11, put this in box 13, so that I don't have to do the steps by hand. Because even before the, you know, for me, I use like simple stacks or whatever, it's web based. But before you get to the point where you can put the numbers in the form, you gotta go to this website, calculate this thing, and Org just makes all of that so much easier.

Shae: I agree. Yeah.

Sacha: And this remote lookup thing is something I'm always looking up because Org tables are so powerful, but also I need more examples in my life to remember how to use them.

Shae: Well, I think it took me four hours the first time to get it all figured out. But I can send you an example without showing it here. I can send you an example because I figured out, I think I've hammered the remote lookup down very thoroughly.

Sacha: And once you've got it right, you can just keep filling that in or copy and paste it. You have an example of the syntax and that's already all you need.

Shae: Right. I did run across some limitations of the evaluation method of Org mode spreadsheets. But maybe I've been using them a little too hard, if that makes any sense.

Sacha: Oh, what kind of limitation?

Shae: Honestly, I think I finally found a way to say every single... Because it was... So really the way that spreadsheets work is they're much more like Dataflow. And that is just that you end up with, like, either you work from the endpoint, which is like much more Haskell style evaluation, which is where you're like, I need to start here. What depends on this? But in the case where you have a whole bunch of different Org Mode spreadsheets, I think I ended up with this little text style hack where I just ran it a bunch of times. So it's like evaluate, evaluate, evaluate. Because remote lookups I ran, you know, I don't remember. And I think I took notes, but I don't remember. That's one of the great things about Org Mode is that I swear it's my, like, half of my brain is in my Org Mode notes. And whenever I had, I'm like, oh, what was that thing? I'm like, well, fortunately, with my terrible short-term memory, I took copious notes because otherwise I would never be able to get back to it.

40:55 finding notes with C-s

Sacha: What is your favorite way of finding those notes?

Shae: I actually use a lot of C-s just because I kind of have some idea of where they are in my tree structure and I'll also say I use a lot of my Org capture templates and they're not super complicated. I have like a to-do, I have a journal, I have ideas and like random ideas will float into my head like you saw Markov keyboard right it is like the weirdest art piece you've seen all day right and Markup keyboard shows up on the front page of Hacker News once a year or so. And people are like, programmers have gone too far. This cannot possibly be usable by humans or something. And I'm like, well, I don't know. I think it was art. And so a lot of times those things will drop into my head, something like that, where I'm trying to do something else. And so I will quickly write down the idea and then just gotten it out of my head enough that I can continue with what I was doing. And so I have a long list of strange ideas. A recent one was like, you've probably had your teeth worked on once or twice. And you know that the dentist always had to move the light around. And I'm like, but we have really good eye tracking. Wouldn't it make sense to figure out where the dentist or the car mechanic is what they're looking at? And then have the light move around behind them to figure out how to actually light up the place they're looking at, right? We've got vision tracking. Why don't we do this? But I don't really, yeah. I decided maybe I don't want to work on that one right now.

Sacha: It sounds like an involved project. Yeah. Yeah, yeah, yeah. Okay, so you're capturing, you're stuffing a lot of these ideas into an inbox.

42:35 Org Mode, managing inbox

Sacha: A lot of people are probably in the same boat where they've got these inboxes full of ideas. How do you deal?

Shae: I archive stuff when I'm done with it.

Sacha: Oh yeah?

Shae: Yeah, so a lot of times, and I find this very valuable, is like if I look at... Do I have it? Oops, that was not what I meant to do.

Sacha: Alright, so you basically just do aggressive speed commands, archive, archive, archive, or look at the agenda and just mark a whole bunch of things and say, that's it, that's gone. It was written down and then it can go.

Shae: Yeah, well, when I'm really done with something, when the thing is finished, then I will just archive it. I mean, do you use Archive much?

Sacha: I do. I have a function that goes through my inbox file and just archives anything that was marked as done.

Shae: Oh, nice!

Sacha: Because that way it clears it up, right? So I'll refile things where I'm like, okay, it's done, but it has important information. I want to put it somewhere else. But if it's just a transitory task that I'm using to remind myself, tomorrow I have to do this, go find the water bottle when it's done, I don't need to know about it in the future. So it's left in my inbox because I checked it off, and then periodically I'll say, clean up inbox. Not only will it remove all of the done things, but if I leave a tag In the title of the task or if the task matches certain regular expressions, it will refile it to the appropriate place in my kind of more permanent thing. So I can say, okay, all of my Emacs related tasks will get automatically refiled to my Emacs category without my having to do that manually.

Shae: So you're using tagging because I kept trying to do tagging and never quite did it.

Sacha: I use tagging sometimes when I remember it, but this is also why I use the The regular expression match against the title. I'm using Orgzly on Android to capture the thing on my phone. I might want to say this is a consulting task. File it in the right place so it doesn't get lost in my inbox.

Shae: Wow. When is your interview so I can learn from your tricks?

Sacha: This is now. Here we go! You can ask questions. The nice thing about conversations is that we jostle different ideas, and we are like, oh yeah, maybe I should write a blog post about that, because I take it for granted. So now apparently I have to write a blog post about my cleaning up process. My inbox is very long. The other thing, speaking of dealing with really long lists that I picked up from John Wiegley was I also sometimes remember to check this list of random items. So in my agenda, there's also like this, you know, random selection of things that I have not gotten around to thinking about further, but it's there just in case serendipity or boredom make me do something.

Shae: you know that's... I've thought about having... because you know, I've got the pop-up this little timer that pops up my agenda, but I've thought about maybe adding a section I don't know if I could add a section here but it would be something that says like at the bottom here's two or three random to-do's that have been open for a while just like for garbage collection. Because I know that in Jujutsu, I've got a cool little query that says, if you have any change sets that are more than two weeks old and are not in a permanent branch state, maybe you should do something about them. It's just called to do. It'd be kind of nice to have that for Org Mode as well.

Sacha: Yeah, it's just, you know, and our brains do these strange things with randomness, right? They're like, oh, I want to see what's new now.

Shae: Right, right, yeah. Oh, I have a question. You have this thing where you had...

46:28 Timestamps

Shae: I saw you taking notes with Prot, and you had this timestamp.

Sacha: Oh, yeah, yeah, yeah. I'm using it now. Okay, okay. So I have it bound two ways now. I have it as a dabbrev, so dynamic abbreviation, and I also have it as a yasnippet because sometimes I'm using it with either SPC or tab to complete it. And I don't really want to think, I just want to get the timestamp in and then move on. And so abbrevs can run functions to evaluate it. You can insert the timestamp that way. Or yesnippet, of course, can evaluate the thing. And now I have those. It's basically just a wall-clock time so that I can go back and plop in the chapters as time offsets, which are automatically calculated from the YouTube data on when the stream started. So I don't have to manually calculate my chapters. But it's super useful to have these times everywhere. And in this case, during a conversation, I want to be able to say, hey, we talked about something interesting. And then be able to go back to that point in the video later on.

Shae: So you're matching? Oh, oh, wow.

Sacha: So my shortcut for yasnippet is "ot" because I never type "ot" elsewhere, and it's close enough. I use Dvorak, so my O is on home row, and T is close by. Also, on the other hand... There you go.

Shae: Did I already show you that this is actually Dvorak?

Sacha: Oh, there you go. Now I can see the keycaps. Yeah, earlier it was kind of blurry, but now, yes, yes. So yes, that is my shortcut for inserting the timestamp. I previously added seconds as well, but then I realized that my kind might be false precision. So I just, you know, just use a minute at the moment and then I go back and adjust the timestamps a little bit later. But yeah, you can use abbreviations for all sorts of things, including times and dates and stuff.

Shae: Have you ever tried Org timestamp?

Sacha: Yeah, Org timer. So Org timer gives you a relative timestamp, right? You can say Org timer. Oh, okay. So, sorry. Are you talking about the C-u C-c ! or something of that sort? So that's actually what I initially was doing, but then it was too many keystroke word modifiers to remember. And then I had to press RET to select the, you know, thing. So now I just have an abbreviation insert the Org mode formatted timestamp for me. And then I have this code that searches for Org timestamp regular expression and then does the calculation and conversion and stuff.

49:12 Org timers

image from video 00:53:52.300Sacha: So Org timer is a separate thing. It's useful for meetings and things like that. You would say, okay, your Org timer starts at the beginning of the meeting and then you can have a list and it automatically, like if you alt shift enter or something like that in the list, it'll automatically like insert the right timer, relative timer to it. There you go. So there's an org-timer-start. But the reason I didn't go that approach was because then you A. have to remember to actually start the timer and B. then you have to synchronize your time with video time. Which might not have started at the same time. So now I'm just like, okay, wall clock for everything. And then I can do the transformation with whatever I like. And since I'm editing my subtitles in Emacs, I can say, hey, this file started at this time, according to YouTube. And then just, you know, map all of the wall clocks to the appropriate subtitle times.

Shae: Wow. That's really cool.

Sacha: Anyway, so timers, relative, absolute, and using abbreviations is great. Which I think actually is a thing that I picked up from Karl. Karl Voit because he also likes to use... He has an abbreviation, not at the Emacs level, but he has an abbreviation on his system level, like with his window manager, so he can use this timestamp trick anywhere, including in Etherpad or wherever else where you want to insert the date and time. That's V-o-i-t, by the way. But yeah, so times are a great way to just leave yourself a pointer to that moment so you can go back to it later.

Shae: Now I'm curious, how well does that integrate with this sort of thing? Because I really like looking back at my history agenda.

Sacha: If you have it insert an inactive timestamp, I think it should still show up there. I think it will be a little like those.

Shae: Yeah, it looks like the... Well, it looks like these two are showing up.

Sacha: Yeah, yeah, yeah. Yeah, so that's a basic thing that I would have inserted by my either abbrev or... So it's not even dabbrev. It's just regular abbrev in Emacs.

Shae: What's the difference?

Sacha: dabbrev is like hippie... Okay, let me just double check here. I feel like dabbrev is sort of hippie expand-ish. It looks in your buffer or possibly other buffers. And I think hippie-expand and dabbrev, they kind of work together. It's an option to have them work together. Okay, so hippie-expand is... Oh, so I see. Hippie-expand is the more advanced version of dabbrev. dabbrev was Dynamic Expand, and Hippie Expand says, yes, that, but try a whole bunch of other things first. But my timestamp thing is actually just done by a regular abbrev, and I will find the thing in my config for "ot". Oh, yeah. I will put it in my chat.

Shae: My spelling, most people say my emails are spelled really well, but it's only because I have ispell set up.

Sacha: Yeah, ispell is great. I am learning French and therefore...

Shae: Oh, c'est très bien. Je parle un peu de français aussi.

Sacha: Oh, oui. I'm keeping a journal in French on my blog and I have the Tatoeba Project with all the example sentences and I have a consult interface to look up stuff in them so I can just borrow other people's words and try to make it sound more natural. Plus of course the usual searching for words in dictionaries and stuff. Anyway, in the chat, I put in my global abbrev table definition for insert format time string. In case you want to steal that, it's right there.

Shae: I will definitely save that into my notes here.

53:53 Org Mode snippets

Shae: Another thing I use a lot is I use Org Mode snippets. I will tell you that the first time, I guess if I look back at... This is another thing that I have done a lot of in the past, which is where... I love the fact that Org Mode snippets are just executable. I can just run them. I guess two jobs, three jobs ago, there was a case where, because I would keep the results around and look at them, there was a case where, I guess a couple of months before, something got shipped to a customer, and I noticed our database schema had changed and I prevented a tremendous amount of upset and emergency by being like this doesn't look great. I got one from two weeks ago, and it does not match. Something's wrong here. Everybody's like, I don't think so, Shae. And I'm, like, no no no, we do have a problem, we've got to fix this. And they were, like, oh crap! And then I was like, yeah, solved a problem!

Sacha: Yeah, I basically try to do as much in a snippet instead of in, you know, in a scratch buffer or whatever, just because having that record, the fact that I did it, and also any notes that I had leading up to it and the output of it, it's just so helpful.

image from video 00:55:39.300Shae: Oh, I've got a cool thing that I'm doing for work. And that is that our readme file is not only a word file, but we also have the demonstration of our actual thing is done by using like dependent snippets. And so that means that like if you want that, perhaps this is something everyone already knows, I don't know, but we basically are using the results of earlier commands in later places. And the other nice thing about that is that then when we want to check, we have to effectively dock tests, right? When we want to check and see if our software works the way it does in the readme, we evaluate the final Org Mode snippet, which then calls it forward, calls it forward, and then if something goes up or not. Well, I guess I need to fix something. And so it was pretty exciting to put Org Mode niftyness into our, into my Word reading file, you know?

Sacha: Nice, nice. And you did mention your other coworker is on board with the whole Emacs thing. So that's one of the things that people are often like, I want to use Org Mode and I want to use it for like the documentation or the testing or whatever, but they got to get everyone else on board with the thing. Otherwise it's Jupyter Notebooks or whatever else, right?

Shae: Right. Okay, so I have a joke for you that I came up with a long time ago, and that is, do you know the only way, there's only one way that Sauron could have organized the invasion of Middle-earth, and do you know what he used?

Sacha: What?

Shae: Orc Mode. It's a terrible joke, isn't it?

Sacha: That's okay. I'm sure someone in the comments will come up with an even worse pun.

Shae: I'm excited! It's going to be great!

Sacha: Never underestimate the punniness of the Emacs community.

Shae: I completely agree. I don't know. Do I have anything else exciting in here?

57:15 Compilation finish function: handle success

image from video 00:57:48.300Shae: I actually really like this one. I used to run all of my tests in compile. F12, I have F12 bound to compile. And one of the things I wanted was, I wanted something where it was, if the compile is successful, don't show me the results, because everything's good. And so since I'm doing stuff in Rust, when I run all the tests, it leaves the buffer up, and I need to get around to actually doing stuff like this for Rustic mode as well, where when the tests pass, just go away, because it's all good. And when the tests don't pass, show me where to... I need to look at the problem. And I got this from Enberg and Emacs, I don't know, 20 years ago. Maybe it was less than 20 years ago, but it probably wasn't. So yeah, there's so much good stuff. Yeah, there's just so much good stuff. And I also like to, oh, look, here we go. You can see that this is long gone, by the way. It's not there anymore.

Sacha: I have a proper, you know, it's sachachua.com/dotemacs. A lot easier to remember. But yeah, and I think that's, yeah, yeah, I remember that now. defadvice is also obsolete. The new hotness is advice-add or something like that.

Shae: Oh, really? I'm going to make another TODO item for there.

Sacha: I was digging through my notes trying to find, do you share your config anywhere?

Shae: No, but you know, at this point if I share it on YouTube, I might as well just throw it up somewhere. Why not? It's not very exciting. Like if you look at someone like Ross Baker who has magic, like wow, is there some magic coming in from Ross Baker? I'm so excited to see more stuff from him. There's just like, I guess I feel like compared to almost everybody else I know, I feel like a power user. Because I'm like, you know, I wish I could do this thing. A lot of times someone I know is like, well, I did that thing and here's a library. And I'm like, yeah, I'll have to do it. And I just, I guess I feel like I'm a power user. And on the good side, I guess I kind of, I really haven't written that much Elisp ever, like I was saying in the comments during your interview with Prot. And I kind of like to, it's just I guess it's never quite gotten to the top of my stack. And I did decide it was time for me to send money to Parade for at least for themes, if not for like, please teach me some Elisp so I can actually, because you know, it's not that Elisp is hard. It's more like, how do I kind of, what are the things I interact with? What are the words? What's the vocabulary of working with Emacs? I don't actually really know. As a user, sure, I can do cool stuff. I can do Lisp macros. I've done Scheme and Lisp some of the past, but not inside Emacs.

Sacha: Alright, so let me clarify. After more than 20 years of using Emacs, did you say you feel like a power user or do not feel like a power user?

Shae: I definitely feel like a power user, but I don't feel like someone who does much of anything with Elisp. I don't really feel like someone who has much of a clue in the internals. And that's not entirely true. I have some of the ideas. But for the most part, I haven't actually needed to know that much about the internals. And sure, I've dug into things like how do you efficiently work with large buffers in your ??, like the ropes data structure and stuff like that. That was more for fun. Although it is something that Emacs does and does extremely well. But I'd kind of like to... There's a lot of things I'd kind of like to change and I don't really have enough of the understanding of the kind of how I would write the Elisp to do it. Here's a good example. When I hit F3, it takes me to the one I'm currently clocked into. Unless I haven't clocked in to something since I started Emacs. And honestly, I would like to use something like org-ql, the Org query language, to go find if I've just started Emacs, and Org does not know about something, you know, I just want you to go search for it. I have so many cores and so much memory, just go find it.

Sacha: That sounds like an excellent reason to go learn Emacs so that you can have it... If you're not currently clocked in, go find the most recent clocked in task and go there, or maybe present you with a list of things and then go from there. I would love to hear about your Emacs Lisp learning journey because that's one of the big things that moves people from, you know, power users, yes, but users, to using Emacs as a lightweight editor toolkit for something that's custom fit to exactly what their workflow is. And on that note, I'm going to try to wrap up gracefully before the kiddo, you know, just like drags me out here. Thank you so much for doing this. I look forward to more conversations. I'm going to post the transcript and other things like that pretty quickly, I think, because I have this nice workflow now that lets me take screenshots and everything, but there's so much here that I want to unpack. But I hear the kiddo, bye!

#+begin_export 11ty

<a name="end-ec22-transcript"></a></details> #+end_exportbvt

Chat

  • JacksonScholberg: ​​Emacs is fun
  • JacksonScholberg: ​Apple's touchpad is another option
  • JacksonScholberg: ​Trackpad
  • JacksonScholberg: ​Lol
  • JacksonScholberg: ​I was curious about what you are tracking your time working on
  • JacksonScholberg: ​How you track it.
  • JacksonScholberg: ​You clock in and out to what you are working on. I like that idea.
  • Bezaar.musicc: ​​That's great!
  • PuercoPop: ​​the buffer api (properties) is the hardest part for me
  • charliemcmackin4859: ​​I think you still have a timer going, btw

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

View Org source for this post

Emacs Chat 21: Amin Bandali

Posted: - Modified: | emacs, emacs-chat-podcast, emacs-chat
  • : Updated with Amin's changes.
  • : Added file enclosure so that it can load as a proper podcast.

I chatted with Amin Bandali about Emacs, configuration, EXWM, keybindings, audio, and life.

View it via the Internet Archive, watch/comment on YouTube, read the transcript online, download the transcript, or e-mail me your thoughts!

Links:

Chapters

  • 0:11 Introduction: Amin Bandali, software developer and free software activist
  • 1:06 Aspects of life: notetaking, editing, multiple
  • 3:03 Configuration: keeping things simple
  • 5:03 user-lisp-directory, site-lisp if you're using an older Emacs
  • 6:35 Organizing configuration into modules
  • 7:49 early-init
  • 9:09 ring-bell-function
  • 9:41 performance optimizations
  • 10:27 user-lisp
  • 11:16 ignoring byte compilation warnings
  • 11:58 init-file-debug = –debug-init
  • 12:56 Core
  • 13:57 no longer using bandali-configure; scoping errors, timing execution
  • 17:06 Why not use use-package
  • 18:39 Defining multiple keybindings
  • 19:48 doric-oak uses emphasis instead of colours
  • 20:52 global font scaling instead of the local ones
  • 21:39 display-fill-column-indicator
  • 22:57 emacsclient for EDITOR and VISUAL
  • 23:38 fundamental-mode-hook
  • 24:25 indicate-buffer-boundaries
  • 26:38 enabling and disabling commands
  • 27:42 package-review-policy
  • 28:58 getting the Info files from the Emacs source directory
  • 29:46 recentf, adding directories
  • 31:41 Scrolling
  • 32:36 auto revert
  • 33:16 Repeat mode
  • 34:53 EXWM
  • 38:05 Audio setup
  • 39:15 keymaps for launching different applications
  • 39:55 bandali-call-interactively-insert
  • 42:29 workspaces
  • 43:50 ZSA Voyager split keyboard, super x as a single key
  • 46:28 Keybindings
  • 48:08 Media buttons
  • 49:45 exwm-input-simulation-keys!
  • 51:43 exwm: managing floating windows
  • 53:13 exwm: application-specific local simulation keys
  • 54:09 binding C-q to exwm-input-send-next-key
  • 54:31 Renaming buffers
  • 55:38 dunst for notifications
  • 56:55 exwm xsettings and responding to screen configuration changes
  • 59:03 Slowly getting back into Org mode
  • 1:00:01 chat notes
  • 1:00:54 Mode line
  • 1:01:50 display-buffer-alist
  • 1:02:24 TRAMP slowness, maybe disabling VC detection?
  • 1:03:42 eat
  • 1:05:09 TRAMP completion
  • 1:06:55 ffs: form feed slides, ^L
  • 1:09:36 Speaker notes

Transcript

Transcript

0:00 Introduction: Amin Bandali, software developer and free software activist

Sacha: Let me do the thing. Go live. Let's check in. Alright, hello. This is Emacs Chat 21 coming back after a decade of not doing it, so… And today I've got Amin Bandali who's a… Is it seven years now that we've been doing EmacsConf together?

Amin: I think so. Since fall 2019. Yeah.

Sacha: Yeah, yeah, yeah, yeah. But of course you also do a whole lot of other things. I was looking through your Emacs configuration and there's like translation and other stuff in there. So would you like to start off with a brief introduction of who you are and how and why you use Emacs?

Amin: Yeah, sure. Yeah, first of all, hello, everyone. Sorry if I'm looking to the side. This is a new setup. My laptop, which has my webcam, is there, but my main display is here. So I might be looking to the side from time to time. But yeah, that aside, hello.

1:05 Aspects of life: notetaking, editing, multiple

Amin: Yeah, I'm Amin Bandali. I've been, I think, using Emacs since 2014 or 15, so I guess more than a decade now. I'm a software engineer by day, or software developer, slash programmer, slash computing scientist. I'm also a free software activist. I volunteer on a lot of free software projects as well, which Sacha mentioned. I do things around GNU. I volunteer with FSF. I'm a Debian Developer, so I try to maintain some packages in Debian. I try to help run EmacsConf from time to time. Hopefully this year I will be much more present. But yeah, that's that. So I first got into using Emacs, I guess, as a programmer tool, like as a text editor. But I've since then kind of integrated it into a lot of other aspects of my life. And I do much more with it, as I'm sure a lot of us do. Yeah, so I use it for kind of note-taking, just any writing, editing purposes in multiple natural and programming languages. Reading and sending email for chatting via IRC. All of that good stuff.

Sacha: This is the sort of thing that isn't immediately obvious from your configuration. I know you've got your Gnus setup in there and you've got your ERC setup in there, but sometimes when newcomers are trying to figure out, okay, there are all these packages, but how do I use them to get stuff done? That's one of the reasons why we want to do this Emacs chat, so that maybe you can show us some of the cool stuff. We are live, but if you accidentally show something personal, let me know and I can kill the stream within 10 seconds and I think then we can be like, okay, we'll just flush that out and then come back once we've hidden the top secret plans for taking over the world, that sort of thing. Sounds good. Where do we want to start?

3:00 Configuration: keeping things simple

Amin: I'm happy to do it however you like. I can either share my screen, pull up my configuration. Yeah, okay, so let's do that.

Sacha: Yeah. If you share your screen sometimes, I think what we did ages ago was we just started walking through the configuration and then sometimes people say, oh yeah, that's really interesting. Let's go and demonstrate that so that people can get a sense of how this actually works. And there were some things in your configuration that I had no idea, like what is FFS? There's like no package. I couldn't find any information about it. But yeah, so your config, if you want to go ahead and share your screen while I Fill the air with hand-waving. Amin's config tends to be more on the minimalist side. I think you mostly rely on built-in things with a couple of external packages. You don't even use use-package at all. It's all run-at-idle-time to delay the startup of various things, and then it's all vanilla Emacs as you can get for loading and configuring things.

Amin: Yeah, pretty much, yeah. Yeah, so before I continue, quick note, Sacha, if you can make me presenter because I don't have access to share my screen.

Sacha: Oh, that would be important, yes. Hang on a second. Let me see. Okay, here we go. Make presenter. I might as well promote you to moderator while we're at it. There you go. You should now have magic powers.

Amin: Thanks. Let's see.

Sacha: It's a good thing we're practicing this before EmacsConf so I remember how all this stuff works.

Amin: Yep, for sure. Okay, let's see. I think I got it now. Can you see my screen?

Sacha: Yes, I can see your screen.

Amin: Okay, excellent. Let's see. Okay.

4:58 user-lisp-directory, site-lisp if you're using an older Emacs

Amin: Yeah, so as Sacha mentioned at the moment, my config is kind of very minimalist and kind of conservative by design, in part because I tend to work on a lot of different machines, whether it's for work or volunteering or whatever, and I prefer to use Emacs if I can. So I want my config to be fairly self-contained so I can easily either git clone or rsync it over. Yeah. To keep it simple, I was using package.el for a while for installing and managing my packages, which I don't keep in my configs repository. But then I decided to switch over to very manual package management with the awesome new feature user-lisp-directory of the next upcoming Emacs release, which basically you can give it a subdirectory in your ~/.emacs.d or ~/.config/emacs. And then it'll go through all the Emacs Lisp files recursively, byte compile them, native compile them, all that good stuff, and add them to the load-path. And for people who are using existing or older releases of Emacs, there's also site-lisp by Philip Kaludercic, which is kind of the… I guess first implementation of what later became User Lisp and built into Emacs. So you can make it conditional and fall back to site-lisp if you want to be able to use User Lisp on older Emacs but still have your configuration be usable. Yeah, anyway.

6:32 Organizing configuration into modules

Amin: So I've experimented with like a couple different ways of managing my configurations like single giant init file of like four or five thousand lines which I know is actually not very large by comparison to I think like someone like Sacha's configuration and also like You know, split into multiple different files, which has its own benefits. And I've kind of actually converged to the approach that Prot uses. If you actually take a look at my configuration file, you see I've drawn a lot of inspiration from Prot switches. Having a literate single file configuration, which then all of the Emacs Lisp source blocks get tangled to individual files. So I can maintain a single source of truth and edit it all in one place, but then also easily be able to share individual pieces to people if they want. So yeah, that's kind of the general approach. And I can dive right in.

Sacha: Yeah, that's definitely the structure that I've also stolen from Prot. And I like the way that you're Your heading names are all long and descriptive, and you've got everything broken down in detail. So yeah, go ahead and walk us through it, please.

Amin: Yeah, sure. Let's see.

7:45 early-init

image from video 00:08:00.067Amin: So that's a brief introduction, and then I have an early init section for doing the early init file. There's a couple of subheadings here. Actually, let me enlarge the font size a little bit to make it more legible. OK, great. I do a couple of things here like disabling package at startup because I don't use package as I mentioned. I manually install and update my packages as git submodules in my configurations repository.

image from video 00:08:15.567Amin: I set load-prefer-newer to t to make sure that I never load any stale code. For example, I might edit some Emacs Lisp file by hand and forget to byte compile or native compile it. And this tells Emacs to basically just use the version of these three variants that's the most recent. Yeah. Nothing super fancy here.

image from video 00:08:35.700Amin: I turn off a couple of things that I find a little bit distracting, like the menu bar or toolbar. Although I do say here that for people who are new to Emacs, they're actually super helpful. Sure, it's a little bit of visual clutter, but in the beginning, it's really, really helpful to help you orient yourself of what mode you're in, what tools do you have available in your disposal. And even someone who's been using Emacs for more than 10 years, I also use it sometimes when I'm like… just starting to use a new mode. So yeah, good stuff.

9:06 ring-bell-function

Sacha: I was very amused by the comment on the… "I don't like getting jumpscared out of my chair." You turned off the bell.

Amin: Yeah, because that actually used to happen when I first started using Emacs. Like when I would, I don't know, I don't even remember when it bells or rings, but Maybe if you like quit like with C-g or like try to backspace into like delete where there's no more characters to delete so it rings a bell and it's very like can be jarring so yeah I turn that off.

9:40 performance optimizations

image from video 00:09:56.367Sacha: Yeah, and then you've got a whole bunch of things where you set some variables to nil temporarily to make it faster, so that's in your startup in garbage collection.

Amin: Exactly. Empirically, there is no hard and fast science behind this. I experimented over the years. I'm pretty sure I believe the default, for example, the garbage collection cons threshold is about eight megabytes. I tried increasing that a little bit to see how much If I increase it to what point will it make my startup faster? And I found this 30 megabytes or mibibytes to be kind of a sweet spot. So I bump that up. And then after Emacs has finished initializing, in the after-init-hook, I just restore the defaults.

10:25 user-lisp

image from video 00:10:51.900Amin: And then, yeah, this is the bit with the user-lisp-directory that I was talking about. Awesome stuff. So you can basically designate a directory. For example, in my configuration, it's just a lisp directory. And then on startup, Emacs will go through and byte-compile, native-compile if necessary, and then add all of that stuff to the load-path automatically. So you get that. Yeah, and then this is the bit about site-lisp that I was talking about. So if you want to use user-lisp, but you're still using older Emacs versions that you maintain, you need to maintain backward compatibility in your config. This is how you do it, for example. So you just yeah, add it to load-path, require it and then call prepare-user-lisp. That's about it.

11:14 ignoring byte compilation warnings

Sacha: I'm picking up that tip about using the ignore directories. I'm getting by with just ignoring all of the byte compilation output, but it would be nice to just say, you know, that stuff is test. I don't need to worry about it.

Amin: Right, right. Thanks. Yeah, I was also doing that. I actually have it as a comment to suppress warning types, like byte compilation, but I was… I plan on working on some packages, whether my own or others, and it would still be helpful to get those warnings, so I keep them enabled. It's still a bit annoying. I still get some of them when I launch emacs but I don't restart or launch emacs as frequently so it's pretty bearable.

11:55 init-file-debug = --debug-init

image from video 00:12:00.400Amin: Yeah, and then I have the main init file. And there's not much in it. It's just the debug-on-error and debug-on-quit. So the debug-on-error thing, I set it to the value of init-file-debug. And if you look at that, the help for this variable, basically if you pass or launch Emacs with --debug-init, this variable will be true. So yeah.

Sacha: I did not know that. Cool.

Amin: Yeah, it's pretty helpful. I think, if I'm not mistaken, I took this from John Wiegley's dotemacs, but I can't remember for sure. It's been years. Yeah, it's pretty nice. And then here, I just set my name and email address. And very early I set a custom-file to keep all of that stuff separate from my .emacs. I don't want it mixing in.

12:53 Core

image from video 00:13:03.467Amin: And then pretty much the only other thing that's in my main init file is just to require and load these different modules or packages of my configuration. I have these as actual packages or as actual features. They provide themselves. And that's just something that I've found straightforward enough to do. I know, for example, Prot uses a dual approach. He has some of his configuration that's more readily usable, available as actual packages. And then the other ones, it's just Emacs Lisp code. It's not actual packages. But for me, I just keep it simple. Everything as packages and that's about that.

Sacha: Fantastic. Let's dive into some of those configuration modules.

Amin: Sure, let's see. Yeah, so this there's this like core thing which is kind of included gets included in all of my other files.

13:53 no longer using bandali-configure; scoping errors, timing execution

image from video 00:14:27.533Amin: I wrote a bandali-configure macro shamelessly based on prot-emacs-configure which is what Prot uses and it basically is a way of kind of similar to use-package for like wrapping a bunch of relevant like Emacs Lisp code all together. It has the benefit, if you use it, if there is an error in that block or in the body basically, then it won't crash everything. That body will just get ignored and we display an error. And that's also the main reason that Prot uses it. The one thing that I added extra to mine, which I took with inspiration from Eshel Yaron's esy/init-step, is to wrap it up in basically time the execution of each of these blocks, which can be pretty helpful to help you see, okay, which part of my configuration is particularly slow. Usage examples. I just have it here. You can either basically pass it like a symbol like thing or you can also pass in a string as the first argument. And this is what will be displayed when you display a list of the evaluation times for all of these blocks in your configuration.

image from video 00:15:22.133Amin: Yeah, and then I have a neat little function here like bandali-configure-report-times that will report these times, whether in the order that it's encountered them, or you can have it sort by fastest to slowest, slowest to fastest, blah blah blah.

Sacha: You mentioned you're no longer using this. Is it because you wanted it to be easier to copy and paste your code? What got you to shift back to the regular vanilla type of configuration?

Amin: Right, as neat as it is, I didn't find it super useful. For one thing, because I don't add or remove a ton of stuff to my Emacs configuration regularly, so if there is an error, it wouldn't cause an issue for the rest of my configuration. I didn't really find that very useful. And then my other potential concern is that the way I was structuring things, I would put all of the configuration, let's say for Gnus, in one of these blocks. But I wanted to be able to break that down into, for example, Org Mode sections more easily. So far, I just decided to not use it. I know I could technically break those down into smaller blocks, but I haven't done that yet.

Sacha: Ihor says, this configure macro looks a lot like good old use-package, which you're not even using in the rest of your config. And I hear you about wanting to be able to split things into smaller blocks with more explanations in between them. So in my config, yeah, sure, I've got the use-package there to do the ensure and all that stuff. But I also have with-eval-after-load because I still want, you know, the links and the screenshots in between.

17:02 Why not use use-package

Amin: Right. Yeah, exactly. use-package is awesome. I have used that in the past, especially when I was using the straight.el package manager. It pairs nicely with it. But yeah, since then, I found it a little bit like too magical for my tastes, kind of along the lines of declaring an init file bankruptcy at some point I really wanted to understand every single line that I have in my Emacs configuration. And at the time, I didn't know a whole lot about macros or wasn't very well-versed with them. So I just ditched it in favor of simply using, as you mentioned, with-eval-after-load. And then that causes all that code to be basically delayed, not evaluated immediately, but when that package is loaded. And then as to when to pull that package in, depending on if I want it right from the get-go of my Emacs start, then I would require it. Otherwise, I add this, as you also mentioned earlier, this kind of timer thing where if Emacs is idle for, I don't know, 0.2 seconds or 0.4 seconds, then go ahead and require this package.

Sacha: Ihor has a tip in the chat. Of course, Ihor has an Org way to do this. He uses use-package whatever config and then he has a noweb reference to the Babel blocks. Then he just says :tangle no on the source blocks so that they don't actually get repeated. Anyway, you can look at it later when you go through. I'll send you the comments or whatever. But show us how you're actually configuring things since you're not using this.

18:37 Defining multiple keybindings

image from video 00:18:55.133Amin: Then I just have another quick macro thingy here, bandali-define-keys, which wraps around Emacs's define-key. It affords me the convenience of defining multiple key bindings, and Prot's version of this (I think it's prot-emacs-keybind, or something like that) he imposes the limitation that the keys should be valid strings that can be passed to the kbd function, which is very fair and valid, but I wanted to not impose that, to keep the flexibility of using define-key directly. The consequences of that, as we can see, is we can pass in the old representation of key bindings, like the vector or whatever syntax, which Prot's doesn't support by choice, whereas mine does. Let's see. For example, let's look at the bandali-theme.el, which is all about… The appearance, I guess, of Emacs.

19:45 doric-oak uses emphasis instead of colours

image from video 00:19:45.900Amin: Yeah, so I just have a conditional block where, you know, if you're in a graphical environment, I'll just go ahead and load Prot's doric-themes, specifically doric-oak, which is what we're seeing right now. I'm using, it's very beautiful, it's very subtle, and it uses emphasis, bolding and stuff to draw your eye to something instead of using a million different colours, which I find pretty nice. Yeah, and then for example here I set up some fonts. I use this Sahel font for Persian and Arabic text. I set a colour emoji font here and this is like we get a kind of preview of what I do. It's like with-eval-after-load 'faces and then blah blah blah.

Sacha: Ihor would like to point out that with-eval-after-load is also a macro that calls another macro. So I'm just going to mention it because it's there. These are your fonts. This is your theme. This is great because everyone always asks, what theme is this? What font is this? All right.

20:49 global font scaling instead of the local ones

image from video 00:20:59.967Sacha: I like your text scaling tweaks that you're just about to go into. You've changed the global mappings.

Amin: Yeah, yeah, yeah. And I actually took this from Prot as well. And it makes a lot more sense. So by default, this, C-x C-+, -, blah, blah, blah, it only scales the text for the current buffer only. But in newer versions of Emacs, in Emacs 29, they also added commands to adjust this globally, including the mode line and all that stuff, which is usually what I want, for example, in this presentation or when I'm sharing my screen right now. It scales everything up globally. So yeah, I just swapped these to be the default, and then I add keybinds for the just local variants in case I need to use that. Yep.

21:37 display-fill-column-indicator

Amin: And then here I have display-fill-column-indicator. I don't know, maybe this is just me, but sometimes I'm kind of OCD about keeping my text lined up at exactly, for example, the 70 characters column. I care a lot about that, especially if I'm writing code or text that I want to also visually look nice. And I enable this. And let's see, I enable it for prog-mode. So yeah, I guess if I, for example, do this… This little thin line that we see here, that's the display filler column indicator. I used to have it globally enabled, but then I found that a bit too much, so I just enable it with a hook in the modes that I want.

Sacha: Yeah, and the theme makes it very subtle. It's just there as a reminder, don't go beyond this line. You can if you really want to, but just try not to.

Amin: Yeah, exactly. And then my essentials… This is where I configure a lot of key behaviours of Emacs, all built-in stuff for the most part, or things that are key to my workflows. For example, I always want to start with a *scratch​* buffer.

22:53 emacsclient for EDITOR and VISUAL

image from video 00:22:53.767Amin: Start the Emacs server if it's not running. And this is very useful, very helpful so that then you can call into an existing Emacs process with emacsclient and have it edit a file. I don't use it for anything fancy just yet. I believe Prot also mentioned in his video with you, Sacha, that he uses it for things like org-capture to spawn a new buffer in his existing Emacs session and things like that. You can do pretty cool things with it. But yeah, I just use it for being able to easily use my Emacs as EDITOR and VISUAL text editors. So yeah, this sets that up.

23:37 fundamental-mode-hook

image from video 00:23:42.200Amin: Adding a fundamental mode hook. Again, I took this from Prot.

Sacha: I was surprised by that because I was like, oh, there isn't a fundamental-mode-hook? Okay, that makes sense now.

Amin: Right, right. Yeah, there isn't a fundamental-mode-hook by design. But I still, in the past, have found that I wanted that. For example, for this display-fill-column-indicator, when I had it enabled everywhere, I was like, it would be nice if I could at least disable it for Fundamental mode. And at the time, I didn't have this. I added this just recently. So if I decide to go back to using something globally, but I don't want it in fundamental-mode, then I can disable it using this. Yeah, and then some standard stuff like I prefer spaces and a tab width of four characters.

24:23 indicate-buffer-boundaries

image from video 00:22:02.433Amin: Visually indicate buffer boundaries. This is a little bit hard to see right now, but here at the bottom left

image from video 00:22:02.433Amin: you see a little down arrow

image from video 00:24:33.800Amin: and then the little top arrow. And… Let's see if I can.

Sacha: Oh!

image from video 00:24:43.167Amin: And also here, for example, when it all fits in the view.

Sacha: Huh, that is cool. I was looking at that. What does it do? And so that tells you, you can still scroll up or you can still scroll down, and you don't have to look at the scroll bar to see where you are. It just says there's more there.

Amin: Yeah, exactly. Yeah. And it also helps distinguish when there's a newline character at the end of the file or not. So here in this buffer, there is.

image from video 00:25:10.533Amin: But if I delete that, you see this indicator here changed shape. But if I go back and add the new line again. So yeah, that's also been very helpful for me because I added configuration files and some of these pieces of software are sensitive to having a new line at the end of the file. So yeah, it's very helpful and useful for that.

Sacha: I would not have guessed that from the very short line in your config that turns that on. It's one line, (setq-default indicate-buffer-boundaries 'left), and yet it adds this nice little nuance to the way that fringe looks.

Amin: Right. Yeah, absolutely. Perhaps I should expand more on it at some point later to explain these things. But yeah, just this one line.

Sacha: May I recommend screenshots?

Amin: Yes, you may, for sure. Yeah, I will definitely do that as well, because I'm also a bit of a visual person. I like seeing screenshots and videos, so yeah I'll take that to heart and do that for my own configuration as well.

Sacha: When I post this, I'll probably… I figured out how to have the transcripts and then screenshots embedded into my transcript. I'll generate it automatically from the subtitle file. Our EmacsConf transcripts are going to get so fancy next year. But you can pull those screenshots and drop them into your config. It'll be great.

Amin: Nice. Yeah, for sure. Sounds good.

26:36 enabling and disabling commands

image from video 00:26:36.433Amin: And then here, I just enable some of these commands that are disabled by default. So yeah, it's useful, especially narrow-to-page, for example, or narrow-to-region. These are commands where Emacs disables them by default so that newcomers don't accidentally hit them and get very confused by what just happened. It doesn't disable them for good. It just basically prompts you for confirmation. Are you sure you want to run this command? I'm sure, at least about these commands. So I just enable them. And then something like, for example, overwrite-mode, which I never use and I don't want to accidentally enable. I just put it disabled so that if I do accidentally hit the keys, which might be, I don't know, something insert or whatever, then it will prompt me to make sure that I meant to do that.

Sacha: That reminds me, I should probably turn that off for myself and then you get a whole new keyboard shortcut you can use too.

Amin: Right, yeah. Let's see.

27:37 package-review-policy

image from video 00:27:37.900Amin: Yeah, I have just one line setting for package.el. In Emacs 31, we will be getting a package-review-policy which is very helpful. So if you do use package.el for installing packages from GNU ELPA, NonGNU ELPA, MELPA or whatever else, you can enable this, and then whenever you update your packages, you'll get a diff of what changed in this new revision of the package that you're downloading and you're about to enable. And you can presumably say yes or at least see what's going on, which I'd find helpful.

Sacha: But you're not using packages, you mentioned, so you're just checking everything out and then you're just git pulling whenever you feel like it.

Amin: Yeah, so right now I'm using git pulls and git submodules, very manual. I put this here because I think it's generally a very welcome change and awesome new feature that I want to spread the word about. So maybe someone who's looking at my config, they use package and that's perfectly fine. So this is just here to spread the word about it mainly, I guess. And if I start using package at some point myself in the future, then I will have this enabled. Let's see.

28:52 getting the Info files from the Emacs source directory

image from video 00:28:52.800Amin: Very quickly, here I extend Info-directory-list. I like to, at least on some of my machines, use Emacs that I built from source directly in the source repository of Emacs. Just after doing make, I don't run make install, even though it's very easy to do that. You can install to a custom location by providing --prefix when you're ./configure-ing Emacs. Sometimes I just find it more convenient for me to not do that and just run make and then exit and reopen Emacs. And for that kind of a setup, I just extend the Info-directory-list to include the info subdirectory of the Emacs source repository so that the built-in Emacs info manuals will be available to me.

29:45 recentf, adding directories

image from video 00:29:46.600Amin: And then I use recentf for tracking recent revisited files. I bind it to C-c f r e for me to get a pop-up completion for visiting a recent file, it has completion. So if I hit TAB here, for example, we can see some of these files or directories that I visited recently.

Sacha: I see. And then you're adding the directory to it. So what does that let you do? Because I'm assuming you're already in there in the directory. But how does that change your recentf?

Amin: Right. So I need to think to remember this, but I think the point of this was that if I open a project in VC or in Dired, then I would like that directory to also get added to my recentf files list, because I think by default, recentf only includes files, not directories.

Sacha: You're in it, you start up Magit or whatever, and then you move on to something else, but you want to be able to easily go back to it.

Amin: Yeah, for example, I like to keep my recently visited directories in recentf as well. Because that's one of the main ways I jump between projects and stuff, even though there is literally a built-in Emacs project mode, which I still use. The only thing that I have here is… I don't want to add my home directory to the recently visited list, so the only thing that this function does is to skip that if I'm opening the home directory. That's about it.

31:38 Scrolling

image from video 00:32:10.933Amin: And then here I configure mouse and scrolling behaviour. So I want Emacs to scroll very gently, one line at a time. I think the default is that when you reach the end of the page, it'll jump half a page down and then recenter. I don't remember default behaviour because I don't use it very much, but yeah, this basically makes it very predictable. For example, when I reach the edge of the page here and I press C-n, it'll only scroll one line at a time, instead of jumping and then doing something like this.

Sacha: Oh yeah, mine does! Mine doesn't do that, so it does that jumping thing. I see what you mean here. Interesting.

Amin: Yeah, so you can tweak that with scroll-conservatively and then scroll-preserve-screen-position, I believe.

32:28 auto revert

image from video 00:32:37.733Amin: Yeah, and then I use autorevert, which is pretty helpful. So this will have Emacs watch, for example, files that are open in your buffers. And if they change on disk, Emacs will automatically refresh the buffer so that you get the latest version. The cool thing is you can press undo in one of these files that's been autoreverted so that you get the revision that was there right before the change. So I've used that sometimes as well.

Sacha: Yeah, and sometimes autofollow also is nice for log files and things like that. But yeah, autoreverting is great.

Amin: Yeah, for sure.

33:14 Repeat mode

image from video 00:33:14.067Amin: repeat-mode is something that I've only recently started using, especially with my Emacs EXWM setup, using Emacs as my window manager. For example, if I hit C-x o, we see here in the echo area where it says repeat with o or capital O. So I can now only press o instead of saying C-x o, C-x o to do that multiple times. Keymaps that have support for this basically indicate that they want to be repeatable can declare that. And then once you invoke one of the keys in those keymaps, then you can repeat it with just that single character. And for example, for my setup, I have that with my EXWM workspace switching keys. So I can easily go to the next and previous workspaces, many of them at a time by just pressing p and n instead of doing the shortcut multiple times.

Sacha: And actually, if you don't mind jumping ahead, the EXWM part of your config is fairly complex, and I think not a lot of people have a lot of experience seeing EXWM in action. And I don't know whether you're comfortable sharing you switching around to different workspaces, but if that is something that you can do, how are you doing all this awesomeness? I'm still too scared to use EXWM myself. Stability. But that's a me problem, not an EXWM problem.

34:51 EXWM

image from video 00:35:26.600Amin: Yeah, EXWM was pretty awesome. I used it back in 2018, '19 for a while, and then I kind of moved on to Sway and Wayland. But I don't know. It's something that I feel like once you try it, you want to keep going back to it. So recently, this past month or so, I decided to give it an earnest try and try to actually address any pain points that I've noticed. So it's much more usable for me now, and I'm sticking with it for now. I'm not a Wayland hater, but I'm just saying, at least for now, I'm using EXWM. And I'm happy to talk about it.

Sacha: OK, what do you love about your setup for that one?

Amin: EXWM?

Sacha: Yeah, yeah. Like, you're doing a lot of rename buffers. Yeah, yeah, yeah.

Amin: Right. Yeah, let me think. There's a couple of things. So, for the longest time, my Emacs EXWM configuration used super key as a prefix, which is the Windows [key] or the one with the logo, basically, to switch workspaces, launch applications and such. And at least the way that EXWM is right now, it doesn't… Like the way you have to add those global key bindings kind of slows down the EXWM startup. And I had many such key bindings.

image from video 00:36:16.467Amin: So one thing that I did kind of recently is to define a prefix map here, like bandali-prefix-exwm-map. So I bind all of the keys and commands that I want here, and then this helps me really minimize what I'm telling EXWM, which is here. For example, this is how you set global keys with EXWM, and I just point it to my prefix map. C-c x and then any of those letters and functions that we saw. That's kind of annoying. I still use the super key here, but I have it s-x and s-,. On the left-hand side of my keyboard, x is right next to super, so I can hit it in one go with one motion almost as a single key with these two fingers. On the right side of my keyboard, I don't have a super key, but I have a control key that I remapped to super. On the right side, I do s-, with these two fingers. It's still very convenient for me to invoke those commands. And pairing this up with repeat-mode, as we can see just here, actually, then I can hit s-, and then p, n, or h, j, k, l many times to switch workspaces or shift focus to different windows and stuff without having to hit that kind of annoying s-x or s-, repeatedly. Yeah.

Sacha: That sounds really cool. I should look into that. Sorry, quick aside.

38:03 Audio setup

Sacha: @blaiseutube would like to compliment you on your awesome audio setup. It sounds like you're in the room with him. Apparently, I sound like I'm on speakerphone, but your audio setup is top-notch, apparently. But that looks like a Blue Yeti, so I have to find out what's going on. What microphone are you using?

Amin: It is indeed a Blue Yeti.

Sacha: Yeah, yeah. So I just have to ask him for okay, what kind of boom mic? Anyway, we'll do that all offline because it's not Emacs related.

Amin: Yeah, it's just the Blue Yeti. Yeah, I turned down the gain. I used to have gain higher, but then it picks up more noise from around the room or around the house. So I turned down the gain a lot and then I get close to the mic so that it only captures my voice. Okay.

Sacha: I'm gonna need the boom. Otherwise, I'm squished into that corner. All right. So you were doing repeat-map before I said oh, let's talk about EXWM because you've got cool stuff there.

Amin: Yeah, and I can continue talking about the EXWM. There's a lot here.

39:10 keymaps for launching different applications

Amin: I have, let's see, s-, SPC. I bind it to async-shell-command to use as my simple, little, dmenu-thing for launching applications.

image from video 00:39:11.767Amin: Some of these things, like browsers, I still do them frequently enough, and I use different browser profiles. So I just define a new keymap so I can basically one-shot launch Chromium or Firefox in a specific browser [profile] or an incognito window and such. So yeah, I just do s-x b and then, for example, c to launch Chromium and all that stuff. So I found this pretty convenient.

39:49 bandali-call-interactively-insert

image from video 00:40:57.567Amin: Speaking of key bindings, before I get down this, let's see if I can find… C-c h. I think this is just before my EXWM setup. I'm pretty proud of this. I love this. It really goes to show how awesome Emacs is and extensible it is. Let's see. So as we know, these various help commands and describe commands are under C-h prefix. But some of them are not bound, for example, find-library or describe-face. Some of these I use pretty frequently. I was really having trouble coming up with descriptive-enough keybindings or short-enough keybindings for all of them. I put some of them here, for example, like C-c f l for find-library. But I can't do that for all of them. What I did was just do C-c h a or C-c h d. What this will do is basically, if I show that, It basically opens up M-x, fills in describe-, and then I can just type, for example, face, and that's it. So it basically opens up the minibuffer for me, pre-fills it with the string that I want, and I can type what is it that I'm looking for. And I found this to be better than trying to bind a million different keyboard things for describe this and that, apropos this and that, find this and that. So yeah and the way that we do that is to just use a minibuffer-with-setup-hook, and you just have a little lambda to insert the string that you give it, and then you invoke it.

Sacha: Yeah, this is pretty cool. When I saw that in your config, I was like, I'm going to steal that. Pre-filling the minibuffer but still letting you do stuff with it, it's such a powerful thing, not just for completing the command itself, but even for when you're using the command, but you want to do something with the input before. You don't want to do it all the way, send it in and submit right away. You want to actually do something with it after you insert it. So great tip.

Amin: Yeah. Thanks. Yeah, it's pretty useful. It's pretty nice. Yeah. And then back to the Emacs or EXWM stuff. So before I had, I used to yeah, sorry, go ahead.

Sacha: Sorry. I forgot whether I was muted or unmuted.

Amin: Okay, no worries.

42:26 workspaces

image from video 00:42:56.600Amin: For the longest time, I had 10 default EXWM workspaces on startup, and that can slow things down a little bit. So I found that okay, I don't really use all 10 workspaces always. So I set it to 5. So I get five workspaces initially. But I still bind keys here. Like if we go down. Let's see. Here. So here, I define those keys for all the way from, let's say, from 0 to 9 for all 10. And then if I try to switch to a workspace that doesn't exist, then EXWM will just go ahead and create it for me. Yeah, so I found that pretty cool. You can create workspaces on the fly. Yeah.

Sacha: Yeah, and I saw that it moves your current window there, too. So that's just like, OK. Let's move it to workspace number two or whatever. Very cool.

Amin: Yeah, yeah, yeah. I have keys or convenience keys for moving some window to some workspace. Yeah, it's nice. Let's see. Let's see. Yeah. So these are just made key bindings. I use hjkl here for switching windows.

43:46 ZSA Voyager split keyboard, super x as a single key

image from video 00:45:46.167Amin: I also have a ZSA Voyager split ergonomic keyboard. I can basically customize it infinitely. For example, I don't really have a super key on the first layer. What I have is a key that will do the s-x thingy, basically, my prefix. So that's the last missing piece is that if I'm at home and if I have this keyboard with me, then I just hit one key and then that's it. I'm in my prefix. But even if not, on the laptop, the s-x or the super comma are still easy enough for me to hit it with one hand.

Sacha: Now I'm jealous and I definitely want to assign my prefixes to their own keys. Very tempting. I've started using the numpad because my laptop has one. I only use the numpad rarely, but we all need more keys.

Amin: Yeah, ergonomic keyboards are pretty nice, especially these ones. For example, the ZSA ones where you can put QMK on it, the QMK firmware. You can define keys in a C file. I can actually show that. Let's see… QMK Firmware, Keyboards, ZSA, Voyager, Bandali, and then keymap.c.

Sacha: Is this in your repository somewhere?

Amin: Right. It's in a different repository, but it's still on https://git.kelar.org next to my configs repository. You can find this as well, but if I go smaller… Yeah, you can define keys here and have different layers, like the base layer. And then you can define a key to switch between different layers and put some of the keys there anyway. So yeah, it's a whole rabbit hole in and of itself. Prot also uses a split ergonomic keyboard. It really does help if you're typing for long periods of time. I actually had these for a while, and I wasn't using them too much, but I started slowly getting some pain in my wrists and here. So I was like, okay, I have the keyboard, might as well put it to good use, and I've started using it.

46:26 Keybindings

image from video 00:46:53.767Sacha: Okay, so most of your keyboard shortcuts come off that kind of s-x or C-c something, and then you have a long prefix sequence, and you just remember everything or you use your… pre-fill some of it and then fill in the rest of the command.

Amin: Pretty much all my window management related keys are on this s-x prefix that I'm showing here. And then I have a few other ones which I think I showed earlier. Is it this one? Anyway, I bind a few general keys outside of the s-x thing, like C-c e i. For example, I have C-c e e for eval-last-sexp. I do that a lot, so it's easy to hit that. Making frames or deleting frames.

Sacha: I love how Emacs uptime is something you use frequently enough that you have a keyboard shortcut for it.

Amin: Yeah, of course. I mean, I'm sometimes curious to see how long has my Emacs session been running. To continue with the EXWM stuff, let's see. This is just some keybindings I define here. It's all Emacs Lisp, right? It's amazing. You can mapc over whatever sequence and create keybindings like that. Only with Emacs we can do things like that. I just love it. Let's see.

48:05 Media buttons

image from video 00:48:36.200Amin: I still keep these three other keys for raising and lowering the volume and toggling mute off of that prefix and just directly on my keyboard, hitting it directly in the exwm-input-global-keys because I do that very, very frequently. But I also have scripts that I can invoke. I should do keycast. So yeah, I can invoke the prefix with semicolon. I can set my volume here, adjust it here, type in what volume I want, or with the single quote, I can enter a value for the screen brightness. I like these things to be exact depending on the lighting in the room. I have preferred brightness values of 50 or 12 or 10 that I manually adjust. I guess it's a poor man's version of having something with a light sensor that can pick up and adjust automatically. I do it manually. Yeah. Sorry, you just muted yourself again.

Sacha: You're just probably this close to writing the Emacs Lisp that takes your webcam image and then adjusts your light. But I think Prot was also saying he likes to do the lighting changes manually as well because warmer colors versus cooler colors and all of that stuff. Anyway, so you have all these buttons that EXWM listens to and it can launch various things for. That's a lot of things.

Amin: Yeah, those are pretty cool.

49:43 exwm-input-simulation-keys!

image from video 00:50:08.267Amin: EXWM has this lovely feature called input simulation keys where You can basically use it to bring Emacs key bindings to other applications like Firefox or whatever. And yeah, it's mind blowing when you try it for the first time. for example, I bind C-b to just hit the left arrow on the keyboard. And it does that. So I can define all of these commands that I'm using or used to using in Emacs. So I can get them in Firefox or other applications as well. Realistically, it's mostly Firefox. It's the only other program that I spend any reasonable amount of time outside of Emacs.

Sacha: Let me point out this very important one that you have there. Under selection/cut/copy/paste, I see a C-w input simulation key. So this is for all the people who have accidentally closed their browser tab while trying to copy text. This is how you solve that problem. Use EXWM and use EXWM input simulation keys and you don't have to accidentally close your browser tabs again. @blaiseutube asks, hey, what about time since last save? Or do you have some kind of autosave magic? you know, in reference to the uptime thing, right? You have this thing that shows you…

Amin: I don't think I have anything for autosave, but I have this habit of… I save everything pretty regularly. Yeah, so I've never really needed that feature, but I'm sure Emacs has something where you can, at the very least, just very dumb, simple implementation of has it been idle for one minute, then just do a save buffer. You can roll your own. But I don't have anything.

Sacha: All right. I'm getting really tempted now to try out EXWM, even if it's just for those global keyboard remapping things.

51:39 exwm: managing floating windows

image from video 00:51:43.100Sacha: How is it for windows that you've got to have floating? I feel like it's very good at handling tiling things, but how is it for sometimes the apps kind of really want the floating window?

Amin: Right, yeah, so you can toggle any window to be floating or not, and you can also - actually, we're just looking at it here. EXWM manage configurations, to match on the instance name or the class name of a window that you can get from xprop, to automatically make that tiling. For example, if I do my prefix and then capital T, it launches a floating terminal for me here. And if I go back to where I set it up, I just launch Xterm with the -name argument. This is where it can set the instance. And I just put any string you can want, like floating, for example. And then here in my configuration, I just check that if the instance name is floating, then I'll go ahead and float the window. Simple as that.

Sacha: All right. This is starting to look exceedingly tempting. Lol, I save everything regularly, so he's one of those people who compulsively hit C-x C-s.

Amin: Yeah, I do that a lot. I don't know. It's just me. But, yeah. Yeah. And then, I don't know. EXWM is awesome.

53:11 exwm: application-specific local simulation keys

image from video 00:53:11.000Amin: You can also put local simulation keys, application-specific simulation keys, depending on, the application, terminals, for example, or, Zathura. This is a PDF viewer. To have application-specific custom key bindings, how cool is that? For example, if I'm in Xterm or something like the Mate terminal, hitting C-c C-c twice basically, it'll just send the C-c key to the terminal. Because one thing with EXWM is that you can set it to capture a couple of Emacs prefixes, like C-x or C-c. So the application by default doesn't see it because Emacs captures it. But this is one of those mechanisms by which you can send a key through. Let's see.

54:04 binding C-q to exwm-input-send-next-key

Amin: The other thing is, you can set it like EXWM inputs send next key. So the default is C-c C-q, but I just bind it to C-q, and I, for example, can do C-q C-t to send C-t to the underlying application. So that's the other thing. Yeah, and then let's see.

54:28 Renaming buffers

image from video 00:55:05.333Amin: So this thingy here, I enable EXWM and I add this rename hook and all it does is basically to add the window titles to the buffer that I can see on the mode line. But as long as it's within a certain reasonable length, like for example, I have 25 characters. If it's longer than that, it will just put dot dot dot (...). So yeah, that's all the purpose of that. Let's see, for example, if I launch Xterm, it appears there. The perfect example is actually here on the right-hand side. On the mode line, we see Firefox ESR Emacs Chat. It's a bit long, so it just puts the dot dot dot there. So that's all that does.

Sacha: Yeah, now being able to use Emacs to manage the tiling of these things instead of my having to fiddle with alt-dragging things to snap nicely into buffers. Yes, very cool stuff. EXWM. Gotta try it.

Amin: Yeah, for sure. Yeah, let's see.

55:36 dunst for notifications

image from video 00:55:36.300Amin: Here I launch Dunst if the executable is installed for getting notifications in EXWM. I think there's at least one or two Emacs specific packages that implement a simple notification daemon or backend so that Emacs itself can handle that. But I found Dunst good enough for my use cases coming from i3, Sway, like tiling window manager background. I just reuse that. So yeah, I just start a process, keep a handle of it in this bandali--dunst-process variable here. And this thing I discovered recently, it's cool. using set-process-query-on-exit-flag, you can basically have Emacs not ask you if you want to exit Emacs if that process is still running. It'll just kill it without confirming with you. So just a little convenience.

Sacha: That is also cool. Just a heads up, I have about 15 minutes before the kiddo runs out because she'll be done with school then. Even just the EXWM part and other things that you've shown us in the config have been super awesome. But are there other things in the next 15 minutes that you would love to show people so that they can see how it works in practice?

56:54 exwm xsettings and responding to screen configuration changes

image from video 00:57:13.733Amin: One thing I'll just mention, EXWM, one more thing, and then I'll go check. I think this is kind of recent: EXWM xsettings, and this allows you to dynamically at runtime change some of these things that you would normally set in an X resources file, like fonts. These kinds of settings were especially commonplace back when Wayland wasn't a thing or wasn't very popular. You would set some of these font settings there. With EXWM xsettings, you can do this dynamically, and what's awesome about that is it also lets you hook into, for example, if your screen configuration changes, if you plug in a monitor or unplug it, then you can run whatever xrandr command to set it up and also adjust those settings. The main thing I use it for is to change the DPI setting. The thing with X11 or Xorg is, unfortunately, there's no per-monitor DPI. There's one global DPI. But I found that on my high-DPI laptop screen, if I set the resolution to 1920x1080 instead of the full resolution, then the default DPI of 96 works just fine with my external monitor as well. All this little hook does, by calling into this function, is: if I'm plugging in my external monitor, lower the resolution and lower the DPI, and if I unplug it, go back to the high thing. I just love this.

Sacha: That's great. We're definitely not going to demonstrate that because plugging in and unplugging monitors is not a good thing for screen sharing, but that sounds really cool. When things change, you can actually get your system to adapt to the changes for you.

Amin: Yeah, it's lovely. Let's see. There's so much more to talk about.

58:59 Slowly getting back into Org mode

Amin: I'm slowly getting back into Org Mode again. For the longest time, I didn't use it and I just used Markdown for my website as well. But I found that it's kind of limited. For example, I was using a Markdown implementation that was written in C and I can't easily customize it. Whereas with Org, I can hook into or create my custom HTML backend that's a derivative of ox-html, even if I don't necessarily like the defaults or the settings for ox-html. I just recently started writing a new backend called bhtml for Bandali HTML. It's just a boilerplate. I don't have much there yet, but that's the idea.

Sacha: I love how you can hook into all of these different aspects of Emacs and get it to do exactly what you want.

Amin: Yeah, so that's cool. Let's see.

59:58 chat notes

image from video 01:00:16.067Amin: I have written some things about the prompt for this meeting. Yeah, so I talked about that stuff briefly. Minibuffer setup. Things that I love about my setup is that it's kind of portable, simple. People can easily copy things from it if they want. It's kind of self-contained. And that was kind of a big thing a while back when I wanted to use my configurations on a couple of work machines. And these don't have direct outbound internet access. So I couldn't do things like installing packages with ELPA because that's done over HTTP. So yeah, I use submodules now. I recently began documenting my setup, very much inspired by Prot and Sacha and others.

1:00:52 Mode line

Amin: The things that I'm looking forward to tweaking next is the mode line. This is basically the default mode line of Emacs. A couple versions ago, they added a setting for compacting the mode line, which improves a lot of the extraneous whitespace in it, which is great. It's still… There's too much information. If you use multiple windows or even especially if you use EXWM all of those things like the date or like the battery get repeated in all of the windows, so I'm looking forward to doing my mode line in such a way that for example, it shows most of those things. And Prot actually has an excellent video about that where he shows how you can create your own custom mode line.

Sacha: I've also been tempted to start using the header line too because that's another thing that you can put information in.

Amin: Right, yep, header-line is awesome.

1:01:49 display-buffer-alist

Sacha: Yeah, the display-buffer-alist is particularly powerful because you're combining it with EXWM, so it'd be interesting to see how you can manage windows and applications and stuff.

Amin: Especially, just like how we saw in today's video call and also a call that I had with Prot recently. For example, if I open a describe-variable or something, it'll by default use the right area of the screen right now where our video is. So it reuses that. So I'm also looking forward to reading more about and configuring display-buffer-alist.

1:02:23 TRAMP slowness, maybe disabling VC detection?

Amin: I'd like to figure out some TRAMP slowness. I recently tried using it again. It's awesome. You can seamlessly open files, SSH into other machines and edit files there. But I don't know. It's kind of slow. So I want to see aside from the latency, you know, the physical limit of the latency because of the distance. Is there anything slowing it down? I think I read in the Tramp FAQ that maybe trying to disable VC mode or VC detection for remote connections might help speed it up, or at least having it do only Git, for example, because by default, Emacs's VC has support for Mercurial, CVS, SVN, Git, RCS even.

Sacha: Anything anyone has ever wanted to use in the last 40 years. Here we go. I saw in your chat config actually that you were doing something with the SSH configs and I'd never come across that. So I was like, oh, that's something I should look into later.

Amin: I don't remember the specifics, but it's all out there. Feel free to look into it.

1:03:39 eat

Amin: Especially with this EXWM setup, I still use Xterm sometimes and I have the Emacs EAT terminal, which is a terminal emulator written in Emacs Lisp. If I launch it right now, it's awesome. It actually is very powerful and it's a properly capable terminal emulator. It just can be a little bit slow. It is slower than xterm, but it's still a lot faster than whatever Emacs has built in. So this is pretty cool. But yeah, I don't want to use it a lot. And I kind of started testing, delegating more things or using more async-shell-command to just basically open this prompt and then do whatever I want. anyway.

Sacha: I've also heard things about Ghost TTY. Anyway, so that's another thing to look into. Yes, so @Paniash47 says, "With Emacs 31, there's a new variable where you can hide the minor modes in the mode line." @pkal says it's mode-line-collapse-minor-modes. And @Paniash47 also says, "I personally use the Minions package by Tarsius, and it has some nice features in addition to the built-in features." So other people are tinkering around with their mode lines as well.

Amin: Yeah, it's pretty cool. And then I don't know, I think maybe you touched on something a couple of minutes ago that I was going to go back to, but I forget.

1:05:07 TRAMP completion

Sacha: Tramp SSH completion out of your configs. I was like, there's a Tramp sconfig in here that I've never used. And that sounded interesting. Yeah, tramp-parse-sconfig.

Amin: Ah, right, right, right. Yeah.

Sacha: Which, of course, we're not going to let go because it's private stuff, but yeah.

Amin: Right. Yeah, you're welcome to try this. I'm pretty sure, actually, I took this from the Tramp manual itself. And it's one of those things where it's set and forget, I don't remember. But yeah, it's here. There was something else that I also wanted to show, but I forget. Let me see if looking at the outlines will remind me or if I will see it.

Sacha: And that's one of the things I love about literate configuration is, you know, just kind of look at the structure and skim it and try to find something with keywords and ordered lists and all that stuff.

Amin: Right. Yup. Exactly.

Sacha: Oh, and you know, people will have access to your full configuration because it is in your repository and you have that lovely HTML export for it as well. So if you, uh, if, if people want to follow up, they can go through that at length. At some point, you're going to add some more screenshots and possibly even video clips to it. so that's there you at https://git.kelar.org

image from video 01:06:34.567Amin: This is my configurations repository. If you go here to treeview .emacs.d, this is the org file. I also export all of those individual components into this lisp subdirectory. All that stuff is here. The QMK thingy that was mentioned.

1:06:54 ffs: form feed slides, ^L

image from video 01:08:15.933Amin: Oh, I wanted to mention FFS. Okay, I'll do that as well. Yeah, what's up with that?

Sacha: I was trying to find information. It was like, there's no package. It's not what is this thing?

Amin: It's FormFeed Slides and it's going to soon be a package. I was actually talking to Prot about it and I'm hoping to submit it for inclusion in GNU ELPA within, I don't know, the next couple of weeks. It's basically very similar to Prot's Logos package. Turns out we both had the same kind of idea at the exact same time in 2022, and we both used it for our LibrePlanet 2022 presentations. Of course, Prot being the diligent person that he is, he polished his work, documented it, put it on GNU ELPA. I still haven't gotten around to doing it yet, but better late than never. Yeah, let's see. I can maybe show a quick demonstration of that. So let's see. Let's see. Anyway, so if I go to my website sources and net-beyond-web. So I had the LibrePlanet talk a couple years ago. So what FFS is basically, it looks for a particular character in this case, or the default case, it's the page-delimiter, ^L, which you can insert by hitting C-q C-l. It basically then designates each of these areas as one slide. So, very, very simple slideshow that you don't even have to use Org or outline or any other major or minor mode. If I launch ffs, by default, it's in a mode where it binds a couple of convenience keys, like p and n, to go into the next and previous slide. You can hit e to edit a slide, similar to Org source, and then make your changes and all of that. And then you can start a presentation by hitting s.

image from video 01:08:58.767Amin: It has hooks for, for example, bumping up the font size or whatever, hiding the mode line. I can toggle the mode line by hitting m here. Let's see. I can also toggle the cursor with c, to make the cursor visible or not. So, yeah. And then I'm just hitting p and n.

Sacha: Very simple, very minimalist. You have a file, you've got page markers, and that's all you got.

Amin: Yeah, pretty much. And then…

1:09:34 Speaker notes

Amin: The neat thing that it has that I also liked implementing at the time is it has a speaker notes feature.

image from video 01:09:47.767Amin: So you can designate a file as being the speaker notes where it has the same structure separators with ^L. But you can type your notes over here, whatever. And you can basically open these in two different windows or two different frames on separate displays. And then in whichever one of those you advance the slides, like p n n, it also does the other one.

Sacha: That's brilliant. I was looking for a way to do that so I can pretend to know what I'm talking about when I have something on screen, but I can just read my notes or even just remember what points I wanted to make. So this is great. You have speaker notes. You've got the main screen. They can be in two different frames. You can have your frame that you're sharing and your frame that you're not sharing that has all of your cheat sheets. Excellent. And on that note, in about one minute, the kid is going to come running out and want to have snack and all that stuff. Thank you so much for walking through parts of your config. There is more. And so everyone who wants to find out more can go check out your setup. I have a great many things that I want to try out, starting from EXWM to little things like figuring out a boom mic setup because apparently your audio setup is making me very jealous. Yes, thank you for doing this. I'm going to post the transcript and the chapters. I have a chapter every minute. It's going to be a long time. But it was good. Lots of cool stuff. Thank you again.

Amin: Sounds great. And yeah, you're very welcome. And thank you so much for having me as well, Sacha. I'm very delighted to be here, especially, I think, just by chance. I think I'm the first person who you're doing this with after the long hiatus. So that's an extra honor for me. But yeah, it's been fun. I could go on for hours. I'm sure we both could. This has been fun.

Sacha: If we wanted to go on for hours, Prot has more flexible scheduling, so he can chat with people for two hours and stuff, and you already have conversations going on with him. But I unfortunately have a small mammal who's 10 years old and loves me very much, and likes to not let me concentrate for very long. But thank you everyone for joining. Thank you for the chat. And thank you also, stream, for all the interesting questions. I will send you all the information and update the post. And we'll see you all on Thursday. I've got another chat. All of a sudden, all these Emacs chats are going to happen. Thanks. Oh, and you said you're happy to be on the hook for doing another EmacsConf this year, right?

Amin: Yes. You can hold me to that. There will be another EmacsConf this year and I will be active in it.

Sacha: Alright then, I'm going to end that broadcast. Thanks everyone, bye!

Amin: Thank you, bye bye!

Chat

  • sachactube: This is a test message
  • sachactube: Getting ready for Emacs Chat 21 with Amin Bandali, https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/
  • JacksonScholberg: Yo
  • sachactube: Yo yo yo, we are live!
  • IhorRadchenkoyantar92: … and the list can continue until the end of the stream? :)
  • IhorRadchenkoyantar92: do you compile those packages?
  • sachactube: Automatically compiled by prepare-user-lisp because of user-lisp-directory, I think
  • IhorRadchenkoyantar92: makes sense
  • IhorRadchenkoyantar92: this configure macro looks a lot like good old use-package
  • IhorRadchenkoyantar92: I just do (use-package foo :config ) and then :tangle no in actual src block
  • IhorRadchenkoyantar92: what is funny, with-eval-after-load is itself a macro
  • sachactube: hahaha, it's much smaller though
  • IhorRadchenkoyantar92: not smaller at all! Because there is recursion with-eval-after-load (macro) -> eval-after-load (also macro!)
  • IhorRadchenkoyantar92: hmm. wrong
  • IhorRadchenkoyantar92: ok. let me not do two things at the same time
  • blaiseutube: yay, I made it!
  • blaiseutube: screenshots and also asciicinema
  • blaiseutube: asciinema ?
  • blaiseutube: whatever
  • sachactube: and gif-screencast
  • blaiseutube: nice
  • blaiseutube: Sacha, your mic volume is just a bit lower than his so it's a bit harder (for me) to hear you.
  • sachactube: Hmm, let me try turning my dial, let's see if this next one is better
  • blaiseutube: better, I think
  • blaiseutube: it's also that Amin has an awesome microphone. The result sounds like Amin is in the room with me and we are both listening to you on speakerphone. it's not terrible
  • blaiseutube: we're all friends her
  • blaiseutube: here
  • sachactube: I think we have the same mic, but he has an awesome setup, so I'm going to bug him for tips =D
  • paniash47: Hello there! Nice to see this chat. :)
  • blaiseutube: yes, low gain and close mic is good. Sacha if prefer to avoid a boom, you can use a microphone with a tight pattern and increase gain. LMK if you want to unleash my inner audio engineer.
  • sachactube: oooh. my mic is right next to my laptop though, so I'm not sure I can get away from the typing noises
  • sachactube: I'll just have to get cozy with y'all
  • blaiseutube: mini buffet is an underrated superpower. I think Kakoune adopted that also
  • blaiseutube: helpful for a11y and users with sequential processing/ ADHD issues
  • blaiseutube: (I noticed that the comments are recorded so I'm trying to add value 🥴)
  • paniash47: Split keyboards make sense with vanilla keybindings. I'd like to switch but moving from evil is difficult :(
  • sachactube: much appreciated!
  • blaiseutube: what about "time since last save" or do you have some auto save magic?
  • blaiseutube: 🤯
  • blaiseutube: emacs all the things
  • blaiseutube: LOL, "I save everything regularly" …so he's one of those people.
  • paniash47: I think with emacs 31, there's a new variable where you can hide the minor modes in the modeline
  • pkal_: mode-line-collapse-minor-modes
  • paniash47: I personally use the minions package by tarsius (Magit author) and it has some nice features in addition to the built-in feature.
  • paniash47: ghostel is the package :)
  • blaiseutube: BRB

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

View Org source for this post

From David Dimagid: What we talk about when we talk about recommending Emacs packages

| emacs

David Dimagid wrote this post for Emacs Carnival May 2026: "May I recommend…". Here it is!

Someone recently said on emacs-devel that they'd like to talk about recommending ELPA packages. Someone else said we should first ask what "recommending" actually means. RMS opened a thread asking that very question. It's still open, and you can follow it there (ELPA: to curate or not to curate).

I think we could apply Rich Hickey's technique here and start by looking up the definition of "recommend" in the dictionary. I invite everyone to do so with whatever dictionary you have at hand and to trust your definitions.

Now, we could evaluate ELPA packages for recommendation based on whether they complement or improve functionality already present in the core. For example, diff-hl by Dmitry Gutov. Its description says:

diff-hl-mode highlights uncommitted changes on the side of the window, allows you to jump between and revert them selectively. In buffers controlled by Git, you can stage and unstage the changes.

That last feature —staging partial hunks— is missing from VC, and diff-hl adds it seamlessly. We could say diff-hl complements the core.

Then there are major mode packages, like csv-mode, markdown-mode, cobol-mode, and so on. They add functionality that doesn't exist in the core. They have no direct equivalent. We could call them standalone packages.

Now consider another excellent package, like diff-hl, that depends only on the core: expreg, by Yuan Fu, the region expansion package. With a single key, it expands the region based on context. The core already offers this through sexp movement commands, but not with a single keybinding — you need several. Some will prefer the native core way; others will prefer the package. We could say expreg improves or, depending on how you look at it, duplicates the core's functionality.

So, in my opinion, package recommendations should be structured around their relationship with the Emacs core. I believe the best-regarded ELPA packages should be those that encourage users to use what the core already offers, first and foremost, and then try those packages because they extend a feature the core lacks or complement it. This would also help more people discover lesser-known core features, increase bug reports, and, over time, bring more contributors to Emacs. That way, the Emacs community could have a package repository it can trust for as long as Emacs exists. Perhaps the person who wrote Elfeed would have known about Newsticker and would have contributed to that package instead. Perhaps if we recommended what Emacs already offers, the Elisp we write would be Elisp of and for Emacs.

If you e-mail me your comments, I can forward them to David!

View Org source for this post