Categories: geek » emacs » yay-emacs

RSS - Atom - Subscribe via email

April 30 Yay Emacs: Sacha and Prot Talk Emacs - Newbies/Starter Kits

| emacs, community, yay-emacs

I will livestream it and update this post with notes.

(America/Toronto, UTC-4) = Thu Apr 30 1030H EDT / 0930H CDT / 0830H MDT / 0730H PDT / 1430H UTC / 1630H CEST / 1730H EEST / 2000H IST / 2230H +08 / 2330H JST

The Emacs Carnival theme for April 2026 is newbies/starter kits. I'd like to chat with Prot about not only helping people get into Emacs but also supporting lifelong learning.

Prot had some notes on how he started with Emacs in 2019 in All about switching to Emacs (video blog) | Protesilaos. These notes were just a few months after he started, so his experience was pretty fresh.

In Computing in freedom with GNU Emacs | Protesilaos (2026), he said:

Remember that I started using Emacs without a background in programming. … I learnt the basics within a few days. I started writing my own Emacs Lisp within weeks. And within a year I had my modus-themes moved into core Emacs.

Prot has several projects that might be of interest to many newcomers to Emacs:

  • modus-themes, which are part of Emacs core and are therefore just a M-x load-theme away
  • Emacs Lisp Elements, a book that helps people learn Emacs Lisp
    • Where does this fit into people's learning journeys? How can they come across it and use it?
  • perhaps Denote
    • What would it take for people to learn enough to be able to use this?

He also offers Emacs coaching. I wonder if any newbies have taken advantage of that. There are a few other coaches listed on the EmacsWiki. (Ooh, Emacs buddy, that was neat.)

Other possible topics: Philip suggested the following general themes for the Emacs Carnival:

  • What are your memories of starting with Emacs?
  • What experiences do you have with teaching Emacs to new users?
  • Do you think if starter kits are more of a hindrance in the long term or necessary for many users to even try Emacs?
  • What defaults do you think should be changed for everyone (new and old users)?
  • What defaults do you think should be changed for new users (see NewcomersTheme)?
  • What is the sweet-spot between starter-kit minimalism and maximalism?
View Org source for this post

YE20: Emacs Carnival: Newbies/starter kits

| yay-emacs, emacs, community

This was a rough braindump on what I might want to write or do for the Emacs Carnival theme this month.

Outline

  • Emacs Carnival April 2026: newbies/starter kits
  • Start with why
    • Curious
      • Cool demo
      • Reputation
      • Someone else (ex: professor)
    • Learning at leisure vs wanting to be productive ASAP
      • Coding professionally; used to VS Code or Vim
    • Journey:
      • Outsiders
      • Newbie
      • Basic working environment
      • Intermediate
        • Packages
        • Configuration
      • Advanced
        • Writing custom code
    • TODO: possibly a post about where people come from and typical resources, next steps
  • Challenges
    • Balance of time
      • Getting a basic environment working
        • Things like git performance on Windows, consoles / window managers taking over keybindings
        • Starter kit trade-off
          • Plus: Get stuff working quickly
          • Minus: Limits your help to the kit's community, can be challenging to customize further
    • Isolation
      • Don't know someone else who can watch them, lean over, fix stuff, suggest improvements, etc.
    • Overwhelm
      • Too much to fit into your brain
      • Don't know how to break things down into smaller steps (which steps, etc.)
    • Unknowns
      • Not knowing the words to look for
      • Not knowing what is close by, what is possible
  • What can help?
  • Stuff I work on / can tinker with
  • Continuous learning
    • Connecting with the community
    • Blogging
    • Managing overwhelm, etc.

Transcript

Transcript

00:00:04 Introduction
Alright, let's see. Hello stream, this is Yay Emacs 20, and today I want to brainstorm some thoughts for an Emacs Carnival post on newbies and starter kits. Okay, alright, and the audio works. Alright, so Yay Emacs 20, Emacs Carnival, newbies and starter kits. That is this page. Yes. So, every month or so, pretty much every month so far, people have been getting together to write about a shared topic. And this month's topic is newbies and starter kits. So, originally proposed by Cena, but Philip added some topics to start with. Things like, what are your memories of starting with Emacs? What experiences do you have with teaching Emacs to new users? Do you think starter kits are more of a hindrance in the long term or necessary for many users to even try Emacs? What defaults do you think should be changed for everyone? What defaults do you think should be changed for new users? And what is the sweet spot between starter kit minimalism and maximalism? So, let me get myself organized here. I want to start off by maybe making a mind map and seeing how that goes. Let's try sharing. I'll do some screen mirroring from my iPad. See if it works. It'll be fun. Okay, there's the pen. Okay, let me think. Newbies... Newbies and starter kits. I like starting with a mind map because I jump all over the place anyway. Starting with something non-linear helps a bit. Okay,

00:02:17 Overall structure
starting with why. People come to Emacs for many different reasons. Some people come because they're curious about something. They've seen a cool demo. They have someone they look up to and they say, how did they do that? When it shows there's a new feature, right? Interesting thing. So that's definitely something that gets people into Emacs. I also want to think about the Emacs news. Meetups, EmacsConf. Maybe do a reflection on how I can help more effectively. And then there's always this thing that I have about mapping and coaching. This is kind of the what's close by. How do I get to where I want? And lifelong learning, because it's not just about newbies... Keeping a beginner mind in Emacs is very handy. And so it's helpful to be able to keep thinking about, how do I want to learn? How can I keep learning? Okay, so at this point I'm really just thinking about topics and seeing where I want to go with this. do have chat open somewhere, so if you happen to drop by and have any thoughts, I think I can do that. Aside from that, you know, you can just also just keep me company, um, or, and, uh, something. Where is this, where is this chat window that I'm, yes, okay, there it is. All right, okay. So this is just me thinking out loud about newbies and starter kits because afterwards I can grab the transcript and start pulling things out into blog posts.

00:04:57 Starting with where people are
So starting from where people are. Sometimes people are curious, either just because of Emacs' reputation or because they've seen a cool demo somewhere and they want to be able to do stuff like that. Uh, sometimes people have kind of, you know, it's, it's totally open. They can, they can learn at leisure, uh, or sometimes there's some pressure to become productive right away. Let's say, for example, if they're coding as their main job, they know that switching to Emacs will help them learn it a lot faster, but at the same time, they still have to be able to keep up with their work. Which means figuring out things like compilation errors and all that stuff faster, which can be a bit of a struggle when you're new and you're trying to set up your environment for your coding system.

00:05:59 The built-in tutorial (C-h t or M-x help-with-tutorial)
@j7gy8b has a question. Do people still try the built-in tutorial? I think so. I see the built-in tutorial of C-h t highly recommended every time people come across, every time people post those threads on... I'm a beginner, how do I get started? Many people recommend using the beginner tutorial because it will teach basic navigation and concepts in a fairly interactive, easy to grasp manner.

00:06:30 Overwhelm
Oh, and somewhere in here, also in the beginner thing, there's probably something about dealing with overwhelm, because Emacs can be very overwhelming. And this is true even for experienced users. I am constantly running like this. I want to learn a long list of things, but there's only so much I can fit into my brain and have it remember things. Very little, actually. So, dealing with overwhelm is a big problem for new users.

00:06:59 Getting a basic working environment
Oh, and then there's something in here about... you're starting off with, like... a total newbie, you need to get over this hump of getting a basic working environment. And if you're a programmer, actually, that bar's a bit higher because you're used to IDEs and you might be coming from VS Code and Vim and have these expectations of what your editor should already be able to do out of the box or with just a little bit of configuration. So you need to be able to at least do some of your work in it without being very, very annoyed. And then you get to the point eventually where it becomes more fun. So this is like a big hurdle there. And then, I'd say intermediate users are people who are able to find and configure and use packages. @j7gy8b says, by the way, he's Jeff from Emacs San Francisco and doesn't know how to change his display name. I will try to remember that you are Jeff. Something about YouTube and Google, I don't really know either.

00:08:33 Sometimes keybindings don't work
@lispwizard says, one problem is platforms which usurp keystrokes which Emacs expects. I just wrestled with this on a Raspberry Pi, especially since there are so many keybindings. So for example, the GUI versus terminal thing. There are some keybindings that don't work if you don't have a GUI Emacs. And of course, if you have a GUI Emacs, and you're in a window manager, and the window manager also has a lot of global shortcuts that that override the ones that Emacs has. So when newbies come across, oh yeah, just use, meta shift left in order to do this thing in Org Mode, which is super cool. And they're like, it doesn't work for me. But they don't have the experience to know, oh, it's because it's a terminal, or oh, it's because, and so forth. So that's definitely all these little things that trip people up. Oh, and I was thinking about... Advanced would be like writing their own custom code. So, if you're trying... this thing here is a big hump, trying to get people through this journey.

00:09:52 Isolation
And, oh, there's also this... some people are isolated. Most people are isolated, I think. They don't know anyone who also uses Emacs. Maybe they're coming across Emacs because they found it in a book or they found it in a cool video, but they don't have someone who can physically sit with them and take control of their computer and set things up the way they want, solve their little Emacs Lisp issues or help them even just figure out the words to find things when they don't even know what they want to ask for. So isolation here. If you happen to be learning Emacs with the help of a mentor, or because your professor really likes Emacs and makes all of their students use it, at least for the course, for the term that they're taking it, then yeah, that's extra lucky because you have someone you can ask for help. But I think a lot of people are picking up Emacs without being able to sit next to someone or look over someone's shoulder in order to discover ways of doing things, which is why meetups helps. Meetups help a lot. Okay, so let's draw a connection between that and meetups. Isolation. Oh, there's also like, having like background expectations and knowledge. And here, these days, it's usually either VS Code or Vim. What other things? Ooh.

00:11:27 Programming vs non-programming backgrounds
Programming versus non-programming. There are a lot of people who actually get into this from a non-programming background. So, programming. Org is a big thing that's drawing in people who are writers and note-takers. This is a whole, like, other... Okay. So there are a lot of things that get in people's way when it comes to thinking about like when it comes to learning Emacs.

00:12:11 Students
Okay, Jeff says in the meetup we do see that young people who are inspired by a professor to try and a lot of Emacs transmission happens this way where you have your stalwart Emacs users who are faculty and who just basically say, all right, this year, you're going to learn... Could be Scheme, could be data science or whatever else. And we're going to do it in Emacs because all of their lecture notes are in Emacs, so it's much easier for them to say here's my literate programming example of what I'm talking about. I'm just going to evaluate it during the lecture itself. So you can see that. And you all should learn Emacs. Usually they'll hedge it and say, you can use other editors if you really, really want to. But there's definitely: here's how to get started. Here's the tutorial made for this course specifically. Here are all the modules that you need. And a lot of people go from there and, and just, it clicks into their brain and they have someone to talk to: both a professor and fellow students who are learning all of this arcane stuff for the first time. So that is an excellent situation to be learning Emacs in. But it's not everyone's experience, so it'll be interesting to see how to support that case as well as other cases. I should write that down somewhere. School. Okay. So, challenges, obstacles.

00:13:56 Basic working environment
This basic working environment thing, I think, is one of the struggles because, like, for example, if people want to get things working with the current best practices for coding JavaScript or coding Python, sometimes getting LSP working just the right way is a finicky process. And then, of course, there's platform differences, like Magit being very slow on Windows. Which can't actually get around because Windows just really sucks when it comes to lots of small file operations. And so people end up recommending using WSL, Windows Subsystem for Linux, instead, which, again, is something that a newbie might not consider or come across or feel comfortable setting up. And then, of course, just install Linux, which is not always an option for people. Let me think. Okay, where are we now? There's so much to write about. What else do I take into account? What else can I add to the conversation? Okay, the stuff that I specifically know.

00:15:31 Stuff I work on - Emacs News
Emacs News helps a lot with a number of things, actually. So I do find that in the conversations and people in the Reddit threads where people ask, oh, I'm new to Emacs, what should I read? People consistently recommend things like the Mastering Emacs blog and book... What else do people like that...? People often recommend Doom Emacs, especially if people are coming from a Vim background. And Emacs News often gets mentioned as one of the resources. I think this helps for a number of reasons, because first it gives people kind of some exposure to the cool stuff that people do with Emacs. So this is inspiration. I think it's primarily on the kind of aspirational stuff. People can see interesting demos and that motivates them to stay with Emacs. And so this is actually probably more of a kind of an Emacs news-ish thing here, from intermediate to advanced. From time to time, I do come across beginner-oriented things in my kind of survey of Emacs news-related items. So let's add that to use also EN beginner stuff. Maybe it's every couple of weeks that someone posts a link that's specifically beginner-related. And one of the things that I've been slowly doing is I've been trying to map it out so that people can find those resources.

00:17:28 Emacs Wiki
And actually I should add a thing here, Emacs Wiki. So one way I could improve is to take the links from Emacs News on a more regular basis and put them into the Emacs Wiki pages. There's like a page for newbies for example and so forth because... Not that newbies will come across those pages themselves, sometimes they do, but also because it makes it easier for other people to say, oh yeah, you want to learn more about that? Check out this page that has all these organized resources already. And one of the reasons why that's useful is because something that new people struggle with is figuring out what's close, what's close by... They know this, what's easy for them to get to? What's something they can learn with not much more effort? And this, I think, is one of the things that having a mentor helps with, or having a coach helps with. Because you can describe what it is that you're doing, or what it is that you're trying, and then they can say, oh yeah, you should check this out. I've started to try to do some of that.

00:18:53 Mapping resources
Let me bring up my map here. There you go. Beginner map. Clearly, that Org Babel needs to be connected to Org Mode. This, again, is not something that I think... Oh, there's actually another Org Babel over there. I need to deduplicate these things. But I'm trying to figure out how to represent the connections. Kind of like those choose your own adventure books, where you might only have some branching points to consider, so you're not overwhelmed by the whole graph. At the same time, you can sort of keep track of where you are. Does this thing still do the thing? Oh yeah, okay, okay. Alright, so this still does, in fact, keep track of what you clicked on. Okay, so I went through a lot of Emacs news links. I think those are the ones that were sort of beginner related. And then I started trying to organize them so that I can say, okay, all right, you've installed Emacs and Linux... I can go find Emacs installation instructions for other places. And then start to think, okay, from here, what are the kinds of things that people usually want to explore next? So, yeah, changing the colors is something that often people immediately want to do because they're used to a certain other look. And so, A tip and some resources, tips and resources, more things, back to the map, and so forth. So mapping the resources would theoretically help me or somebody else be able to say, okay, where are you in your learning journey? And what do you want to learn about next?

00:21:00 Clojure
Jeff says perhaps Clojure is a route to Emacs for experts. I've heard it's the best IDE for that language. And I should mention that too, because Clojure... Am I no longer sharing? Okay. because Clojure. Yeah, it is so far I think still one of the, like Emacs is still one of the reference IDE for it. So that is, we see a lot of people come into Emacs because They're working at a Clojure shop and they basically want to use the same IDE that everybody else is already using there. Or they're getting into Clojure, they want to do work in Clojure, and so they're learning Emacs because because that's kind of the standard IDE for now. I think the State of the Clojure survey recently said there are other editors gaining ground... More editors means more places to learn, more places to pick up ideas from, so that's not terrible. It's okay too. But that's definitely a reason why people come into Emacs. because it's the standard way of doing things. And of course, Org is wonderful, and Magit is wonderful, and people come into it just for those reasons. That is okay. And sometimes people use it only for those reasons, and that is also totally okay.

00:23:02 Emacs News and a map
Okay, so Emacs News is one of the things that I can fiddle with, and that can go into a map. And the map is more... Again, it's not quite in the state where newbies might navigate it, but if I were theoretically to have office hours, for example, then I might use that to quickly go through, like, okay, where are you? What do you want to learn? And here's some resources that other people have shared that might be helpful. And then theoretically, maybe they will keep exploring from there.

00:23:38 Cheat sheets
Oh yes, the How to Learn Emacs cheat sheet that I made ages ago. Learn Emacs. I think this is 2003. No, no, it's 2013, it feels like. I should include here. How to learn Emacs. Yeah, 2013. Okay. And the idea there was kind of a one page sheet with sort of like the most common things. What the difference is between a frame and a window, and what's the mode line, and some pointers to other things that you might want to learn. And this was... I think this was before starter kits like Doom Emacs. I don't even have Oh, this is an old URL. In fact, I should go change that. I don't even have a recommendation to learn Org first thing. Take your notes in it. Oh, no, I do have. See, it's Org Mode. Is it Org-mode? Is that even still? Yeah, okay, okay, that's still on it. Thank goodness. Okay, okay, here we go. Let's add that as a thing. So that's still being recommended, but the idea of having a single page cheat sheet, there are actually quite a few of these cheat sheets anyway. Making one yourself is always a good idea. It's a good way to deal with the overwhelm, so cheat sheet. Jumping all over the place. That's just how my brain works. It's okay. Okay, so the things that I can fiddle with. Emacs news. I have a beginner section up there. I could add an introduction to do. Add intro. So when people get to Emacs News, can I get to it? Yes. Right now, there's just this very basic subscription options, feed XML, mailing list, index.org. But I can add a little more information here for new users. to say, okay, this is how you set up elfeed. This is what Emacs News is. It's a little bit overwhelming, but you can use it for... you can keep an eye out for the beginner thing. You can look through the archives for beginner related links. And you can also start to look for recent resources related to the topics that you're interested in. So that's something I can do. There's probably an interesting way I can mark that in the audio. "Hey Sacha, do this." So that's one thing I can work on.

00:27:04 Meetups
Meetups are great for newcomers because you can get over that challenge of isolation, especially when they realize that it's totally okay to ask questions at meetups and show the things that you have that aren't working and then other people will help you think about them and figure something out. I've seen a fair bit of live debugging at places like Emacs Berlin and the Org Meetup. It's hard to ask questions sometimes on Reddit, although a lot of people do. It feels a little bit like Reddit is more effective as a help platform than Stack Exchange. But sometimes you need a bit more back and forth, and that's where the meetups can be helpful. So I guess the progression there is ask on help-gnu-emacs or, well, ask on your project-specific mailing list or help-gnu-emacs or Reddit or the Emacs subreddit. And if it feels like it needs a bit more back and forth or showing things, the meetups are helpful for that. I've also seen people asking questions in Mastodon, which is very nice. But Mastodon is a little bit more of a technical thing, I think. It's not something that a lot of newbies will be on. Anyway, the meetups. People come across meetups. Not that often. But Emacs News helps with coming across meetups because I include upcoming events in the first section here. And so what I should do is in the intro, I should also mention how to subscribe. Meetups are great. Inspiration. Okay. And that's there. We run the Emacs Big Blue Button web conferencing server year-round. We don't leave it scaled up all the time because that would be expensive, but we usually keep it as a Nanode so that I don't have to spend the week before the conference scrambling to get everything sorted out and hoping that the latest install script didn't break anything. So it's fine. We just run it year-round and then scale it up for meetups. Right now it's scaled up monthly for the Emacs Berlin, Emacs APAC, and Org Meetup meetups. But if there are other meetups that would like to have a free and open source software platform to do it, we can certainly do that. We can add them to the list there. Anyway, so that's Emacs. It goes into Emacs News.

00:30:19 Emacs Calendar
There is also an ical for it, which I could mention more prominently. Oh yeah, I actually do already mention it fairly prominently over there, so that's fine. Although I guess some people might not know that ical files can go into your calendar. So I should mention calendar in this intro for newbies that I should write, kind of like how to make the most of Emacs News. And that actually takes, is generated by this Emacs calendar thing. So that lists upcoming events. I also update the Emacs Wiki page for it with a copy of the thing, and I generate HTML calendars as well, in case that's what people prefer. Calendars. Calendars all over the place. I even generate org files in a gazillion different time zones, so that people can just include that. And I think then the time zones are all sorted out automatically. Because we... I don't think we still have time zone... We have time zone support yet in Org Mode? Anyway, it's there. Meetups. Where was I with... Yes. I need to add this to the intro. Let's highlight that in the thing that I need to do. Emacs news.

00:31:54 EmacsConf
EmacsConf is more of a, again, it's an inspiration sort of thing. We like to start the day with more beginner-oriented talks. So I'm always looking out for presentations that that makes sense to share and encourages people to kind of get into Emacs less slowly or workflows for Org Mode that can inspire them to try it out and make it a little bit more manageable. So that's in a yearly kind of schedule, students, rhythm. And so I guess the Emacs News and Emacs Conf ones are definitely more about inspiration, giving people reasons to stick with the learning curve because they can see what Emacs can do in other people's hands. And the meetups sort of help with the getting over the hump of getting a basic working environment going. Although actually people don't usually ask about basic working environments because they feel maybe a bit embarrassed. About asking about such?

00:33:15 Where people ask for help
I see more of those, like, okay, I'm trying to set up this, you know, this LSP thing, and I'm getting stuck on this thing. I see more of that on Reddit. It might also be in help-gnu-emacs, but I haven't actually been reading help-gnu-emacs, because I feel like it might be a high-traffic mailing list. I should find out, okay, what's help-gnu-emacs like these days? Because I want people to be able to... Okay. So this, I feel like, is more of... It tends to be more of a... More of an intermediate resource at the moment. Now we need a place where... Okay, so Reddit seems to be a place where people are not intimidated by the thought of posting beginner questions. And there's also Emacs Stack Exchange, but I don't think people use that as much these days. Some... Maybe... I think there's... Again, this is sort of still... Still kind of intermediate-ish questions. Maybe what I should do is...

00:35:12 Emacs Clinic?
This actually set up kind of that Emacs clinic sort of idea, which could be Thursday. Tomorrow could be a good time to experiment with it. Okay. Whenever my iPad display times out, the UX screen mirroring becomes unhappy. So let me go restart that. I need to configure a longer timeout. Let me kill that all. Kill all uxplay. All right, let's try that again. Once more with feeling.

00:36:09 My TODOs
Okay. So that's probably my big to-do out of this, is Emacs news and how to learn Emacs. Both tend to be starting points. Emacs news more than how to learn Emacs, since how to learn Emacs is a little bit dated and I need to update the URL anyway. Update URL. Where was I going with this? Anita, what was I just talking about? And the inspiration part is actually also useful for encouraging more people to try out Emacs in the first place. So that is part of the journey. Usually it's curiosity drawing people in. Sometimes it's someone saying, I'm your professor, we're going to use this. But usually it's curiosity drawing people into Emacs. So if I wanted to write a blog post about or a reflection about what I can do to help people get into Emacs more effectively, I'm still kind of focusing... I still tend to focus on the intermediate part because... Why do I? Because that's the fun part for me. When you can start to customize Emacs to fit what you want. But in order for people to get to that point, they have to be able to get Emacs to the point where they can use it for their day-to-day stuff. And then they will want to spend more time in it, and then customize it to their particular needs. So, if my evil plan is to continue enjoying the cool stuff that people come up with in Emacs, it does make sense for me to help people get their basic working environment set up.

00:38:39 Videos
@benmezger says, there are quite some interesting YouTube channels to learn Emacs too. Yes, yes. There are great video series that people have done in the past. System Crafters is often recommended, although I think David has moved on to focusing on other things lately, like AI. But his videos on Doom Emacs, though, are still often recommended as resources. Video is helpful because it shows people how it fits together and how the workflow works. Things that are hard to see from articles and blog posts. Videos are a little bit frustrating sometimes because they are slow. You actually have to watch them. But I like the way that people have been posting Videos with detailed show notes in a literate programming style, with embedded snippets, and often they will even use this blog post as the starting point of or the final product of their video. I would like to be able to do more of these myself, but it may require that I learn how to organize my thoughts, which is part of this whole brainstorm things, and then ideally turn it into a blog post or series of blog posts. The videos are great because they help people show workflows, which is good for inspiring people to put in the effort to then go through the show notes and try the steps, but also kind of see other things that the person making the video might not have even mentioned. Often people will make a video, and a lot of the comments are like, what is that theme that they are using? Or they do this thing which changes the window configuration, and what is that? Delete other windows vertically. And the presenter might not even have thought of mentioning that. but because we are virtually looking over someone's shoulder, you get to see that. Ben continues, videos, indeed videos help show how powerful Emacs can be. Simply installing Emacs doesn't give you that viewpoint.

00:41:12 Learning curve
So that's it. I think, especially since our learning curve is, remember that meme that got passed around before really memes were codified, invented? Where the learning curve of Emacs is kind of like this. This is the learning curve of Emacs. It's just very fractal. We need that inspiration to help us get through the afternoons of, ah, why doesn't this thing just break out of the box? Why do I need to write Emacs Lisp to configure this? It's definitely a very different expectation from many other editors, where you're just expected to either have it, or check a checkbox, and then it's there. But because Emacs, there's so many different ways to use Emacs, it's really hard to say, okay, this stuff is going to be hard-coded for everyone, or this stuff is going to be the easy way. Anyway, and people come into Emacs with all sorts of different expectations too, right? So it really helps to see other people use Emacs in a way that suits them And to know that it is possible to have something that suits you as well. So making more videos. I would like to get the hang of doing that also. But I like blog posts and I like transcripts. So I want to be able to improve my workflow for making these videos and live streams so that They also make sense to people who don't have the time to watch a video stream for one hour or whatever. And it would be great for the video to make sense even if you're not looking at the video directly, you know, to make the audio make sense in case you're listening to it like a podcast while you're washing the dishes or going for a walk. So blog posts and podcasts.

00:43:21 emacs.tv - TODO: Add more to the beginner tag, make a playlist
Which reminds me that Emacs TV is a thing, although that's not super beginner-friendly in the sense that I can't just say, here's all the beginner-related topics. I should go back over the 3,000 plus videos over that and maybe index the beginner ones. Let's see what we got here anyway. Emacs TV. How many do we have now? Yeah, 3000 something. Do I have beginner? I do have beginner as a tag. 26 things flagged as beginners. Some of them are in different languages, but that seems like the sort of thing. That could be fun as a YouTube playlist, because people like to just play through a playlist. And then I can try to sort them, I guess? Maybe. Beginner playlist. Beginner playlist. That's another to-do. Okay. Interesting. This is great. I'm identifying a number of to-dos for myself. All right. Lifelong learning, which is how I want to take this idea of newbies and starter kits and apply it to everybody because many of the same problems that we run into, many same problems that newbies run into with regard to isolation and overwhelm and the balance between tinkering with your config and getting stuff done. Let's write that down somewhere. and Isolation. Unknowns. Okay, so four common problems that newbies run into. Isolation, overwhelm, balancing, tinkering with your setup and getting stuff done, and kind of getting the set like Dealing with unknowns. Let me turn down the filter. It's a little too strong. Now can I make hand gestures? Not really. Okay, I will tinker with that eventually. okay um the same kinds of problems that we run into even if we've been using Emacs for decades uh and this uh uh emerald that i'll uh establish in the video it's a lifelong journey uh okay so

00:46:36 Isolation
Isolation. Meetups help. But meetups are harder for people to get to. You might not find something that's the right schedule for you. I highly, highly recommend writing about your Emacs learning. Blogging is a great way to connect with other people who are interested in the same kinds of things. And we've got Planet Emacs Life. Ooh, I should write that down as a thing. Planet Emacs Life. And we've got Emacs News to help kind of keep the conversation circulating. So that's there. @Mtendethecreator says, what's up? What's up, @Mtendethecreator? Currently I am brain dumping various things for various ideas for the Emacs Carnival April. Okay, so isolation, overwhelm, balance of time, unknowns. So here I want to think about, okay, even for people who might not consider themselves as total newbies anymore, It's always good to keep a beginner's mind in Emacs because there's so much to learn. Just the other day, I was reading a discussion thread where one of the commenters was singing the praises of Org Remark, so now I have a new thing that I want to go figure out how to add to my workflow. There's always something interesting to tinker with and learn. Anyway, so everybody can benefit from the things that we can do in this area. Isolation, I'd strongly recommend blogging, Meetups This is where the aggregator goes in.

00:48:54 Overwhelm
Overwhelm, figuring out how to take notes and how to bring up your notes... Customize interface So that's how people start to deal with that. Balance of time... I don't know. I think this is a much... This is an ongoing problem. And... Well, ongoing challenge. Because the... You know, tinkering with Emacs becomes more fun as you get used to it.

00:49:35 IRC
Oh, IRC. Yes, IRC. I should mention... We should definitely mention that. IRC. Helps with isolation and getting help. Although people also... like some... are they still having issues with spammers and needing to restrict the channel? I've been meaning to write a page that explains what to do in that situation. I should drop in to see what's going on there. Reddit, I think, is where people... Okay, I need to... Okay, let's label these things. A, B, C, and D. And this balance of time is actually related to getting a basic working environment started out. So if the reddit is good at A and C and also D actually. Isolation and balance of time. A little bit. People have to learn how to use pastebin and it's a little bit harder on IRC to say, oh yeah, this is the... People do pastebin the problem and then people sometimes do pastebin the solutions. Sometimes a lot of things can be handled by a quick question, so that's good. Okay, I said isolation. Balance of time is always still a problem, but people develop their own productivity prioritization type things. Structures? Frameworks? And for lifelong learning, this unknowns part becomes really interesting and powerful. Yeah, and this is where bumping into ideas helps. Through IRC, through Reddit, through all the Emacs News, etc.

00:52:19 Learning from other people's configs; TODO maybe a livestream?
Charlie says, searching through GitHub for Emacs keywords to see how other people configure things helped my Emacs customization understanding. If Emacs customization is one of the things that helps people move from being a total newbie to an intermediate user, then maybe it makes sense to have and in addition to the clinics that I mentioned, some kind of a live stream where we just go read other people's configs and then talk about how to adapt it and show a demonstration of a way that fits into the workflow. I think that could be a lot of fun. I've been enjoying going through Prot and tecosaur's literate configurations, and slowly assimilating some of those snippets into my configuration. So it might be interesting for people to see more of that process of not just copying and pasting the code, but trying to figure out, okay, what can support me as I try to make this part of the way that I do things? Or how do I tweak it so that it's a blend of what they came up with and also what I want. So yeah, @mtendethecreator says, tsoding's config also. Yeah, whoever's config is posted, we can go through it. And then I can say, oh yeah, that's really cool. Like for example, reading Prot's config. I learned about delete-other-windows-vertically, which I think he had assigned to C-x !, like C-x !, I think, yeah, which is cool because it's like C-x 1 except it's shifted. So that teaches me about the function and also a convenient shortcut that makes sense it's easy to remember so reading through other people's config could be a thing that might be helpful for you to do and because again because video is annoying to go through if i can have my workflow for Adding chapter markers into it. Then I can jump into... Then people can jump to just a section. Charlie says, that sounds nice. I cherry picked a lot of Purcell's config as I hit modes I wanted to use, and then later I adapted it to use-package. And now it's mine. Yes. Yes, that's the... That's wonderful. That's the basic idea. That's one of the reasons why I love it when people share their configs. Okay, so that gives me plenty of things to do. And if I want to think then about this blog post... Let's write in a different color. I can use colors! Let's write in... Can I write in green? Okay. Okay. That's too... Okay. Blue looks... Blue looks linky. Let's write in... Okay. Maroon? Alright. What does this feel like? I have seven minutes before I should probably go check on the kid for maybe doing math together with her. She gets really bored in her math class, so I tried to do... I offered to do some math with her that's a little bit higher level. uh

00:56:07 Discord?
@mtendethecreator says please create a discord for your channel. IRC is cool but the new wave of devs prefer discord. Think about it. I know system crafters runs a discord for their community. Are there other discord places that emacs people hang out in? Yeah, there's like... I have to look into whether it's possible. @DavidMannMD says, I can highly recommend Prot's book on Emacs Lisp. Yes.

00:57:10 Thinking about the blog posts
So this sounds like maybe there's a blog post here about the factors that people... Like, trying to give some basic recommendations on where people... If this is your background, this is why we make this recommendation. These are the recommendations people often make. And this is why. And here's some basic resources. So this sounds like possibly a blog post. Post about where people come from. And typical resources. Next steps. And there is probably a blog post here about the challenges. which I can address from both a new user perspective as well as the, hey, this continues to be a challenge. And then there's one here about following up on my to-dos. And let's highlight these, make it easier. Someday I will actually pick colors that go together.

00:58:55 Books
Ben says, would including books be a good option for lifelong learning? There's some interesting books I've seen throughout my journey. Yes, yes. I love how the books, there aren't a lot of books because Emacs keeps moving, but it takes a lot of effort to make a book. But the people who have written books, like Prot, like Mickey, do an amazing job of organizing things into a linear structure that makes sense. Books are great for this, especially for dealing with the sense of overwhelm and unknowns. Let's take a few a little bit at a time.

00:59:46 Manuals
The manuals are great too. Just even going through the Org Manual once in a while helps me stumble across things that are helpful. So getting people to feel like they're ready to read a book earlier rather than later, or feel like they're ready to read the manual. and maybe modeling how to do it, like showing them, okay, you can be reading this. The manual doesn't have a lot of examples, but this is how you can dig around for examples to see how it works. Could be helpful.

01:00:25 Maybe annotating the manual?
I feel like if we have like an annotated Org Mode manual, here's the manual, but here are also some links to videos where people are demonstrating this concept, it could be interesting. One of my to-do's for a while has been do that do that kind of beginner map, but for Org, because people have shared a ton of Org resources in Emacs News. Where was I? Books. Yes, that is. Okay, so there are three things... probably more.

01:01:04 Starter kits
Oh, starter kits! That's a whole other thing. Starter Kits. I think that if people are coming from a, let's say they're coming from a programming background, and there's pressure on them to be productive as soon as possible, then Starter Kits are a great idea, possibly. If they find a Starter Kit that fits the way they think, and gets the stuff they need working as soon as possible, fantastic. Hats off to them. Go for it. And then they can ease into more Emacsy things later on. The challenge, of course, with starter kits is because they change Emacs a lot, it makes it harder for newbies to get help outside that community. So they should pick a starter kit with a community they can ask for help within. Other people will be just like, I don't know what kinds of things are going on there. And of course, the newbie has no idea how to disable things or turn things off or go back to vanilla for some things. And so it's, it's, it's just complicated. Can't really expect people helping to go install this separate starter kit and figure that things out. The starter kits are useful in that situation, but in other cases, like for example, if you're getting into Emacs slowly and you're curious, it can help to start from vanilla so you know what things you're adding to it.

01:02:32 Navigating source code
@lispwizard says M-x apropos, looking at Emacs source files for related stuff are also helpful. And learning how to navigate source code to find examples and read it is also a skill that nobody is born with. Figuring out how to help people develop that skill is interesting. But I will go check on the kiddo now.

01:02:51 Braindumping with company
This has been very helpful for me. Kind of brain dumping random ideas onto... It's not even really a mind map. It's just bleargh onto this sketch. But doing it with people hanging out and helping me remember stuff or think of stuff is helpful and well worth my voice getting extra tired. So thank you for coming and hanging out with me today. And I will go work on turning these things into blog posts and possibly videos and live streams going forward. I will skedaddle now. Today I need to sew a hat for my kiddo, but tomorrow, I will probably hang out with you maybe slightly roughly at the same time. Thanks, everyone, and see you!

Chat

  • @j7gy8b: ​​do people still try the built-in tutorial?
  • @j7gy8b: I'm Jeff from Emacs SF and I don't know how to change my display name
  • @lispwizard: ​​One problem is platforms which usurp keystrokes which emacs expects (I just wrestled with this on a raspberry pi).
  • @j7gy8b: ​in the meetup we do see that, the young people who were inspired by a professor to try
  • @j7gy8b: ​Perhaps Clojure is a route to Emacs for experts. I've heard it's the best IDE for that language
  • @benmezger: ​​There are quite some interesting youtube channels (yours included) to learn Emacs too
  • @lispwizard: ​You can often watch videos at 2x speed…
  • @benmezger: ​indeed. Videos help show how powerful emacs can be. Simply installing Emacs doesnt give you that viewpoint
  • @mtendethecreator: ​​wazzup
  • @mtendethecreator: ​​someone says pi-coding-agent is the emacs for ai agents. thoughts?
  • @benmezger: ​IRC perhaps? although a little complex, you learn tons from the Emacs channel
  • @charliemcmackin4859: ​​Searching through Github for emacs keywords to see how other people configure things helped my Emacs customization understanding.
  • @mtendethecreator: ​tsodings config lol
  • @charliemcmackin4859: ​​That sounds nice… I cherry picked a lot of purcell's config as I hit modes I wanted to use… and then later I adapted it to use-package…and now it's mine :D
  • @mtendethecreator: ​please create a discord for your channel. irc is cool but the new wave of devs prefer discord. think about it
  • @DavidMannMD: ​​I can highly recommend Prot's book on Emacs lisp.
  • @charliemcmackin4859: ​​(as an idea for looking at other's configs as a method of learning… "how would I adapt this to use use-package?" is something I find myself thinking a bit)
  • @benmezger: ​Would including books be a good option for lifelong learning? There are some interesting books I've seen throughout my journey
  • @lispwizard: ​​m-x apropos, looking at emacs source files for related stuff are also helpful
  • @lispwizard: ​​Thank you.
View Org source for this post

YE21 April 23: Continuing to think about newbies / starter kits

| emacs, community, yay-emacs

I continued thinking about the Emacs Carnival April 2026 theme of newbies / starter kits. Here are my notes and transcript from my previous livestream on the topic.

Overview

My goals for this 1-hour session:

People often recommend Emacs News to people who are looking for resources or inspiration. I want to make it easier for newcomers to Emacs to:

  • feel more connected with the community and find sources of inspiration that can encourage them to keep going
  • find recent beginner-related resources without needing to page through the archives
  • find examples of workflows and tutorials for common needs
  • not feel overwhelmed by all the links; be able to focus on the things at their level

Some things I can do:

If there's time, I can flesh out my outline further. YE20: Emacs Carnival: Newbies/starter kits

Chapters

  • 00:01 Starting up
  • 03:23 Newbies and starter kits
  • 05:55 Emacs News
  • 07:14 Let's move the mailing list option up
  • 07:51 An aside talking to Prot
  • 09:52 Challenges: Isolation
  • 10:45 Overwhelm
  • 11:14 Balance of time
  • 11:33 Unknowns
  • 14:00 Post-its
  • 14:21 Finding help
  • 14:53 Testing BigBlueButton
  • 17:02 Thinking about reviving Emacs Hangouts
  • 17:48 Emacs News as a newbie
  • 18:29 Aside: Jeff is looking into making VS Code plugins
  • 18:57 Notes on making the most of Emacs News
  • 20:50 RSS
  • 23:42 newsticker
  • 27:25 Stream delay
  • 28:31 Reading news with newsticker
  • 29:04 The usefulness of screenshots and videos
  • 34:20 Back to Emacs News
  • 35:00 Prerequisite knowledge for Elfeed
  • 37:29 Other resources that people might find useful
  • 40:56 Beginner map
  • 42:44 emacs-news/index.org is 5.5 MB of plain text
  • 43:55 consult-focus-lines
  • 44:13 Organizing the links
  • 45:02 Organizing screenshots and videos by package
  • 45:49 Info pages
  • 47:08 Remembering keybindings
  • 48:40 The guided tour
  • 50:07 Recap
  • 53:12 newcomers-presets
  • 57:52 Wrapping up
  • 58:19 Remembering keybindings
  • 59:13 Picking Prot's brain next week about the newcomer experience

Transcript

Transcript

00:00:01 Starting up
Alright everyone, this is Yay Emacs 21 and I think it's a good opportunity to continue with thinking about newbies and starter kits. Also, theoretically, you might be able to join via Big Blue Button. I will put the link in the chat and we can experiment with it because I have no idea if it works or not. Let's go see. That's not it. Let's get the right one. I need to have shorter URLs, but that will come eventually. Step two, find the chat window. I have too many windows. Okay, let's see if that works for now. And then, let's find out if everything gets crazy if I share my... Like, how does this work? I unmute myself. Testing. Okay, that shows up. I am logged in with the EmacsConf user at the moment. I probably have a me account on this as well. I just don't remember if I've got that set up yet. Anyway, we're experimenting with these because next... next week? Next next week. Next next week or so. Yes, next next week I am chatting with Amin Bandali and we're going to start doing some Emacs chats, possibly on BigBlueButton because it's free and open source. So that is all goodness. And let's share screen one, I think. Could not share the screen. Hmm. I'm going to try this with the other browser. Let's paste in my join link. Let's log in as me. Microphone. Ah, it doesn't like my microphone. Fine. Let's see if this lets me share my screen. Entire screen. Share. Okay. Alright. So now I'm sharing. I am not sharing. It's not happening. Well, it's thinking about it. So my goal is to get to the point where I can use big blue button to share my sub goal, my side quest, to share my screen so people can see what I'm talking about and stream at the same time. But it doesn't seem to be happening, so that might be something I need to fiddle with off screen. OK, I will just save this for if anyone wants to drop by and share their stuff. OK, that is cool. I will live.

00:03:23 Newbies and starter kits
Okay, let us get back to whatever I can do. So yesterday I was thinking about this Emacs Carnival April 2026 topic of newbies and starter kits. And I wanted to start thinking about what I can do to help people with isolation, overwhelm, and these little challenges that come with being new to Emacs, but actually there's still challenges that we deal with, even when you're experienced. And I'm seeing people in the chat, but it's not showing up in the chat of social stream. Boo. So @Mehrad42 says hello, and @JacksonScholberg also says good morning. Good morning to you too. I have, in the notes and transcript... I've actually updated this with a transcript, I think. So now my post from yesterday has the video from yesterday, which is great. It also has my outline, which might be slightly easier to read in non-dark mode. Dark mode, dark mode, dark mode. Tough. One second, thought. Never mind, you can you can deal with the dark mode flipping yourself. So I have the outline, I have some to-dos for myself, and I have this lovely transcript which I edited and added chapters to because text is wonderful. So all of that is there. Probably there's still some misrecognized words in it, but handy. And then the outline up there has the links. So theoretically, I can start taking this and doing stuff with the thoughts and with the text to figure out how that goes. Let's see. Reload. Ah! Did the reload work? No. Okay. Things that I don't quite understand, but that's okay. I'll live. Okay. Let's get on with it then.

00:05:55 Emacs News
So a lot of people recommend Emacs News to new users or to other people who are interested in keeping up with what's going on in the Emacs world. I want to make it easier for people to find the resources and know what to do with things. So here's where they often end up. One of the things I've just added is a note that you can get to this page using a shorter URL, like https://sachachua.com/emacs-news or https://sacha.ac/emacs-news. And I should probably make it also work without the dash because then peoplethey don't have to remember, okay, does it have a dash? Does it not have a dash? And so forth. So that can be a to-do for me. Add an nginx redirection for Emacs News. No dash. All right. And I've also added this. Are you new to Emacs? Check out these tips for making the most of Emacs News. Plus quick subscription options, elfeed and nnrss for your favorite newsreader, MailChimp, or whatever.

00:07:14 Let's move the mailing list option up
I feel like it's slightly easier for newbies to deal with mailing lists because everyone knows how to do email and not a lot of people know how to use the awesomeness of RSS readers. So let's in fact switch this around so that the mailing list is up there. And let's make elfeed a link. Where is elfeed?

00:07:51 An aside talking to Prot
Hey, bonjour, Prot! Okay, Prot is also dropping in. I actually wanted, so I have the session with Prot next week and I actually want to pick Prot's brain about the newcomer experience as well. I've decided to draft some notes around that in here. So instead of my just telling you about all the cool stuff that I've been building for updating, you know, updating YouTube related entries on my blog or whatever. I want to pick Prot's brain about newbies and starter kits, which is great because Prot had some contemporaneous notes in 2019 when he started with Emacs. There's a video blog and he shared his experience starting as a non-programmer. And in his recent 2026 talk, for which the transcript and the video are also available online, these are both in the emacs.com page. You can follow these links yourself, but I will copy them because I can. Let's copy, copy, copy, copy as. Why do I have too many options there? Okay. So I will copy these links in. Prot says, starting Emacs without a background in programming, he learned the basics within a few days, started writing his own Emacs Lisp within weeks, and within a year, he had contributions to core Emacs. So I'm curious about how we can make the newbie or starter kit experience better for people. And as a quick summary of what I discussed yesterday in my brainstorming thing, it's in posts.org, which I have a sketch of. Sketch of? Yes.

00:09:52 Challenges: Isolation
We are thinking about the problems of isolation, where people generally don't know somebody else in real life who is into Emacs and can just lean over and fix stuff for them. And also they're not looking over someone else's shoulder and getting inspired by The cool things that they're doing. I'm not sure you can get much more isolated than being a mountain hermit in Cyprus, so Prot is an excellent example of still managing to be virtually connected, even though he's physically isolated. Oh, wait, actually, we do have some monks and we have some mountaineering guides who still manage to make interesting completion frameworks, like Helm. That's Thierry. Anyhow, so isolation is something that a lot of people feel is very challenging for them when it comes to learning.

00:10:45 Overwhelm
There's overwhelm, so just the sheer number of things that you need to learn, the new terms for everything, the keyboard shortcuts, the things that you've got to do in order to get a basic working environment set up to the point where you feel comfortable spending some time in it every day without feeling like it's holding you back. Cheat sheets and actually things like menu items and toolbars can be helpful for that.

00:11:14 Balance of time
Third problem is balance of time. You know, spending time tinkering with your config versus spending time getting things done, which is less of an issue if you're learning it at a leisurely pace, but more of an issue if you are under some pressure to become productive as soon as possible.

00:11:33 Unknowns
And the fourth is the things that you don't even know to look for. This is where Emacs News and other sources of inspiration can be helpful because then you come across a video or a blog post and you say, I can do that. And if you're lucky, that video or blog post will be accompanied by a tutorial that says, okay, this is step-by-step how to do it. But often there's still a lot of translation that's needed so that it can fit with your particular environment or your particular workflow. @JacksonScholberg shares that they gave up on using Emacs yesterday, and then they realized they could use VS Code to get things done while they're learning Emacs. So it's not an all or nothing thing. You can learn, you know, you can still use another editor to do most of your work, but use Emacs for a small set of things that you know how to do with it. You know, you might just know how to edit a file and save it. And that's it. That's good. That's great for starters. And then every day you might learn one new shortcut or one new thing that you can do. Gradually, your use of Emacs will grow and grow and grow until you start thinking, hey, why can't I just read my email in Emacs like all the cool kids? Or why don't I just go figure out how to browse the web in Emacs or keep track of my sewing in Emacs. That does actually happen. So yeah, totally just start small. But this process of breaking things down into tiny steps is something that newbies might not know. There are a number of different ways where people can get this sort of advice on how to break things down to make things simpler. One is, you know, every time people post this challenge on Reddit or elsewhere where they say, OK, I want to learn Emacs, but there's so many things. How do I learn this? Everyone keeps saying, OK, start small.

00:14:00 Post-its
Maybe have a Post-it note, which cannot be seen, a Post-it note on your monitor with the keyboard shortcuts that you are trying to learn. or have one text file where it's just your notes about what you're learning. Just break it down.

00:14:21 Finding help
Or people can go to, if they're having a hard time finding out what to break it down into, they can go to places like Reddit or IRC, the Emacs channel there on libera.chat or in meetups and say, okay, this is where I am now. How do I do this? How do I get there? And that might be helpful. Anyway, so those are the four challenges.

00:14:53 Testing BigBlueButton
What I want to do today with the one hour I have is I want to, unless other people happen to drop into the Big Blue Button, I think that I am also trying to experiment with except for some reason I'm not sure I can share my screen, which is a little inconvenient. I will debug that later. Anyway, what I can do in the background is start to think about the experience of coming to Emacs News as a newbie. Hey, @JacksonScholberg is in there! Okay, theoretically this sort of works. I don't know if people want to say things. What is going on? Hang on a second. uh okay uh. Call from the school so we'll have... I asked him to call me back in one hour and we'll see how that goes. Hello, @mtendethecreator! Feel free to unmute yourself and share anything if you want to in the Big Blue Button. In the meantime, I will continue... I have not actually spent some time yet thinking about how audio will work with this because Google Chrome and Mozilla Firefox have a little bit of a problem, I think, with sharing my audio. Actually, maybe this. This is a test. Can you hear me through Big Blue button? Maybe that works. Maybe that doesn't. We'll see. Okay. And in the meantime, I can just continue with this until people want to experiment with that part. All right. Emacs News. So Emacs News. Hello. It works! It works! People are talking. I mean, people can talk. Thank you very much. I can actually hear you. Feel free to jump in. And for anyone else who also wants to be on stream, kind of, I will paste the Big Blue Button thing again. And all y'all are going to behave yourselves, I hope. We'll see.

00:17:02 Thinking about reviving Emacs Hangouts
One of my long-term goals would be nice to revive these Emacs Hangouts that I used to do on Google Meet, I think, a long time ago. But of course, we've got Big Blue Button now, so we can do it on proper free and open source software, where people just come and share what they're working on, what they're curious about, what they want to learn. And then we can try these sort of... Now I'm going to try to remember to pause every moment so people can interject.

00:17:48 Emacs News as a newbie
Emacs News as a new person is a little bit overwhelming. Imagine a newbie says, okay, I'm new to Emacs, what should I read? And people recommend things like, oh, check out the Mastering Emacs book. Read the C-h t tutorial. It's great. It is a great starting point. Oh, if you want to keep up with what's going on, interesting things, and how you get connected to the community, read Emacs News or subscribe to it. So this is a little overwhelming for people.

00:18:29 Aside: Jeff is looking into making VS Code plugins
Jeff says that he's researching making a VS Code plugin, actually. Good luck! If you run out of things, like if you run into things that you can't do with VS Code, I think some people have experimented with doing Emacs-y things inside VS Code or vice versa. I'm not entirely sure. I can rummage through my notes and see who has mentioned that before. If there was an EmacsConf proposal for it before.

00:18:57 Notes on making the most of Emacs News
Okay. Anyway, Emacs news. So I have this now where I say, okay, check out these tips for making the most of Emacs news. So like I was saying, I was thinking maybe starting with... Let me find the page that edits this. Topics, Emacs News. Okay. Starting with email is probably the easiest, so I will do that. Do I even want to nudge people to use MailChimp? I don't particularly like MailChimp. This is just Emacs News as either HTML or plain text emails. Includes Org version if you prefer. Oh yeah, I mentioned that here. So that's mine, and then I have an explanation of... If you are reading email email in Emacs... Yes! You can read email in Emacs. You have... All right, so there's that. RSS. So now I have more of a description of how to get it by email. And this goes to the subscription page. People can fill it in. It works like all the other mailing lists people are used to.

00:20:50 RSS
If people want to subscribe to RSS, new users for Emacs will probably not even know what RSS is. Why they might want to do it. Um... Do I want to explain this here? Okay. Does elfeed come with enough of an explanation so that a user can get started with it? Not very much of an explanation. Okay, is there an elfeed tutorial that I can... I feel like this is not really an elfeed tutorial. I feel like there needs to be like a basic from scratch, "I don't even know which init.el or .config/emacs/init.el or .emacs or whatever thing I should use." There should definitely be a tutorial here. Let's add a comment. I need to actually probably add a tutorial for setting up elfeed from scratch. Okay, is there a feedreader that people like to use? So why RSS? RSS lets you read updates from sites that support it in a way that's more structured, that's separate from email, without using your email client. Why RSS? This is like a nice friendly description. Get updates. You can also... That's not very much of a Why RSS sort of thing. Why RSS versus email... Which is handy when you find email overwhelming. If you find email overwhelming.

00:23:42 newsticker
Okay, newsticker. I will also add... @charliemcmackin4859 suggests newsticker. It seems pretty friendly. There is a newsticker feed reader for Emacs. Okay. Is there a newsticker Emacs tutorial that I can link to? Okay. So this is like... use customize-variable... Is there a newsticker? There's load-library, newsticker. newsticker-url-list. Okay, let's go see what that looks like. Okay. I need to load the library before I can do that. load-library newsticker to load it. newsticker-url-list. Okay. Click on INS and add... Oh, as a URI... Click on INS. Emacs News URI. That... Okay, let's try it ourselves. Emacs News. And that is the URI. Huh, I never actually used this. Okay, I'll click on apply and save. And then, how do you actually watch it? I mean, look at it. newsticker. newsticker-start? No, it's not like that. Okay. newsticker-show-news. Oh, okay, okay. newsticker-show-news. Alright, okay, okay. That is newsticker. That is fairly easy to get started with. So let's recommend that. So this is set up.

00:27:25 Stream delay
We are slightly delayed, @charliemcmackin4859 says. It is because I am trying to have a 10 second stream delay in case I do silly things like accidentally show my entire email screen online and other such things. I have a panic keyboard shortcut and a panic menu item. This is the panic menu item. See, it says panic, which kills the stream. I previously had another OBS that this could stream to in order for it to switch to a backup message if I cut the streaming, but for some reason that one is segfaulting constantly when I start streaming from that second OBS instance, so I need to look at that more. But yes, now we have a little bit of a stream delay, and 10 seconds is a bit long, but apparently my reflexes and my panicking are still kind of tough at the moment. Eventually, when I get better at saying okay, I know which keyboard shortcut to go, I can reduce the delay, but yes. All right.

00:28:31 Reading news with newsticker
Reading news... This is.. what is this again... That was newsticker-show-news. Thank you so much. So that was a very helpful tip from @charliemcmackin4859. Okay so there's the tutorial, mini tutorial... Elfeed is slightly more complicated, but also quite useful. Okay, so we can just move this one for now. We should show people what it looks like.

00:29:04 The usefulness of screenshots and videos
So @mehrad42 says, when I started with Emacs, one of the biggest issues was not to know what each package does. Some have a picture or video or ASCII cinema, but most of them don't. Yeah, that's definitely a thing. It would be great for more packages to have screenshots and descriptions, and videos show workflows better than just... Since the people making packages and the people making videos or screenshots or blog posts are not necessarily the same people, we should have a different way of finding the resources related to a package that might be helpful. Where was I? I was actually taking a picture, adding a screenshot of this, right? Okay, so let's show this screenshot over here. And I want to show, this is what it looks like. And I take a screenshot using my [super-s] and this is the newsticker thing. And then I'm going to stick that in this page. And this is what it looks like. This is what I'm saying. Insert screenshot. That is not the last screenshot. Where did the screenshot go? Oh, hang on a second. Okay, newsticker. There we go. That's because the recording keeps getting bigger. So this is a screenshot of newsticker. There you go. People can then see and decide for themselves: is this worth it? Because inspiration is... The things that people struggle with when it comes to overwhelming, there's a lot of stuff to get through. The main question that newbies will have is, is this worth it? Is it worth it to read this tutorial or figure out how to fit this package into my config, figure out how to set up my config in the first place? Having a screenshot or a video up front makes it much easier for people to say, "Yes, I want that, and I'm willing to spend one or two hours to figure out how to get that working." I want to add a screenshot to this one, of course, so that people can see what it looks like. And in fact, why don't I stick this up here so people can see right away. Let's see what that page looks like if I have that. Blog Emacs News. Oh, that's not it actually. This is topic Emacs News. All right. It is not actually showing up. Why isn't it showing up? That shows up there. Okay, good. My export is not exporting. Fun. Okay. Hang on a second. Let's look at the HTML. I expect that to just have ~/proj/static-blog/topic/emacs-news/index.html. I expect that to have the image. It does not have the image. Why does it not have the image? Is it because it has a description? Derp. Okay, let's try that once more with feeling. Yes! Okay, okay, okay. Almost. All right. Now my caption is not captioning. Is it because... Is it because it's a list and it's getting confused because it's not a block? Okay, okay, okay. Here's a preview. Here's what newsticker looks like. Built into Emacs. Progress! Progress. @JacksonScholberg says it's gotta be ASCII Cinema. I actually haven't been using ASCII Cinema. I should probably check that out too. I've just been recording videos.

00:34:20 Back to Emacs News
Okay, okay. So now on my topic, Emacs News. Has it been copied over yet? We are making things better live. This is great. Okay. Do I want to always, like... People are scrolling through this. Yeah, it's fine. I can put that in a details disclosure thingy if they want to not see it unless they click on it. It's there. People can scroll. It's fine.

00:35:00 Prerequisite knowledge for Elfeed
Elfeed is a separate package. You'll need to know how to install packages. You'll need to know how to add... Is it available? Where is it available? It is MELPA or el-get so people would have to know how to to enable MELPA, which is not listed here, so this is a bit more advanced. You'll need... Then nnrss and Gnus is like way advanced, so Elfeed is more of an intermediate. Newsticker's basic. You're right, this is what we should probably recommend if people are just getting started. Which means I should include it in here. News... Do I say elfeed somewhere here? Oh actually, emacs-news.html. This is the header part here. Use newsticker. That means I a tip instead. This is like, topic emacs news, how to subscribe. Oh, I'm not in Org Mode. I can't just use those links. I'm sad. Topic, Emacs News. Fine. Write HTML. Okay, here we go. So now the tip is there. and I can send that to my blog in the background. Progress is being made! Where are we now?

00:37:29 Other resources that people might find useful
Other resources that people might find useful... EmacsWiki has a newbie sort of page. Here we go. This is where I want to gradually start adding stuff. I cannot... Emacs newbie page on Emacs wiki. Okay, so if people are starting out, I want them to come across the Emacs Newbie page for sure. What else should they find out about? So let's go see. Fairly straightforward. I don't know if Emacs Newbie with Icicles is, uh... Well... I feel a little uncertain about this recommendation, but I don't want to take it all away, because someone's put a lot of work into it. Maybe it might be helpful to add some other stuff. Okay, anyway. Help. So i need to make sure there's a way for people to get help. Yes. Okay. The beginner map thing that I mentioned, which I do not have... I should have as a... Beginner resources from Emacs News Archives. And How to Learn Emacs. That's definitely a thing. Oh, yeah, let's mention Planet Emacslife. So we're just going to link up a bunch of things here for now. And, um... Where are we? I'm very confused. Did I accidentally close my Big Blue Button thing? Oh, no, we're still here. Planet Emacslife aggregator brings together lots of Emacs-related blog posts.

00:40:56 Beginner map
You know, this thing over here needs to have me saying, Hey, if you need help navigating this, please email me. Where is this even? Beginner map. Okay, if you need help navigating this or would like to suggest other beginner related resources, please email me. Alright. Let's explain why I'm doing this. I want to make a map of those things people often wonder about when they're learning so that you can find what's close by. Maybe we'll add... Theoretically, unless weird things happen, I should have that introduction. It's always good for people to have contact information. There you go. Okay. So that gives them a list of the things that are in this, and then it gives them, like, themes.

00:42:44 emacs-news/index.org is 5.5 MB of plain text
Okay, okay, okay. Back to Emacs news. So Emacs Newbie, plan an Emacs life, map of some beginner resources. What do people also find helpful? Yeah, there are tons of resources. So @JacksonScholberg says, I didn't know there were so many resources for Emacs. There are tons of resources for Emacs. In fact, if you want to go through all the ones that I've posted in my Emacs news thus far, this file over here is five megabytes and basically includes all the links, links, links, so many links. ever since the first one that I have in this thing. It's long and it's in Org Mode, so you can you can just search through the categories you're interested in, or you can use occur or this new command that I just found out about.

00:43:55 consult-focus-lines
If you have consult, you can consult-focus-lines and it will do kind of like occur but within your regular buffer. So it just focuses on the lines that match or don't match a specific expression. Anyway, there are a lot.

00:44:13 Organizing the links
What I'm thinking of doing is I'm thinking of going through all the things that said beginner, anything that I stuck in the beginner category, and filing that somewhere in the map. So for example, here, this is a kind of a meta discussion. How do you deal with that overwhelm problem where you're like, I'm overwhelmed by the number of key bindings that I want to learn. And there's a discussion here about, yeah, you know, do the tutorial, then take advantage of which-key, make sure which key is enabled, memorize the basic movement keys, and then start, you know, start using Post-it notes. Everything's fine. You can just stick a Post-it note on the thing. Yeah. So there are a lot of beginner related resources and there are a ton of other resources for other things.

00:45:02 Organizing screenshots and videos by package
So what I probably can do is to help with a newbie issue where they're curious about learning Emacs, they don't know whether it's going to be worth spending the time to do it, is I can look for or keep an eye out for interesting videos that come, you know, or screenshots that come along with detailed tutorials on how to get started. Let's say, for example, Org Mode Latex Export or how to set up your Emacs for JavaScript development. And then I can say, okay, if you're starting out, these are some of the things that you might typically be interested in. How do you get started with it for note-taking, for example.

00:45:49 Info pages
@mehrad42 says, also info pages are a very good source of information. The info pages' key bindings are a bit odd at first, so need some explanation. We should say that in the Emacs news, assuming people are starting out from scratch and they don't know how to get help. It's kind of something about... Also the Emacs and Org Mode manuals are great. You can read them as within Emacs with C-h i, with M-x info. Yeah, that's C-h i. Or find them on... Emacs manual, and the Org one is here as well. Okay.

00:47:08 Remembering keybindings
@maxfriis says try to articulate what you want to do with words that start with a key binding. To easily memorize key bindings. I like to use M-x. M-x also shows keybindings. I have it set up with marginalia and consult, which I think might be too advanced for newbies, but definitely completion is one of the things I like to get people up and running first. Is there like a recommended quick start? Here, you're brand new to Emacs. Get this going. I guess that's where the newcomer presets thing comes in and I should see what's inside it. Emacs says try to articulate what you want to do with words that start with a keybinding to easily memorize keybindings with the letter used in the keybinding. So this is advice to make your keybindings mnemonic, to make them make sense. And it's probably useful for newbies to learn that you can easily change your keybindings so that they can make more sense to you. Sorry, C-c plus a letter is reserved for your use so you can stick whatever keybindings make sense to you on there with regular letters and everything.

00:48:40 The guided tour
So I want to link to something from Emacs News that gets people started on that journey, which I think might be the Emacs Newbie page. So the Emacs Newbie page will link people to is a guided tour. Guided tour. This is not very much of a guided tour. There used to be a better guided tour. Where is it? That's a guided tour. Okay, that's a guided tour. Okay, that's a guided tour. All right. So it gets people through navigation, but it does, can you, does it talk about configuration? It does not talk about getting started with your configuration. Okay, where do we start telling people about getting started with configuration? Learning Emacs. Okay, maybe I should include all these things. I cannot decide.

00:50:07 Recap
Okay, well, we'll start with the Emacs New page, which is already better than it used to be before. Okay, so today I wanted to: update the header of the Emacs news page to make it easier for people who are new. I've got the short URL so that people who are recommending them, it's easier I think maybe to stick it in people's brains. Although, challenge as always, spelling my name is tricky. So maybe I need to make sure that yayemacs.com/news goes to this as well. which I don't think it currently does. So, did I already add that as a TODO? Ah, here we are. Also, yayemacs.com/news and emacslife.com/news. I mean, I have domains. I might as well use them. Okay, so that's done. And I've updated this. so that people can start to connect with the community and find ways to work, you know, find better, find ways to use this Emacs beginner thing. It's still a little hard for people to read. You know what I should do is I should take this beginner resources So my beginner resources org is in ~sync/web/beginner-map.org. So if I make this part of... sacha-copy-filename. Okay, if I make this part of my... I want to say it's like a refile target. Yeah, here we go. And I want to say, okay, add that to my refiles. So then if I... think about this carefully... C-u C-c C-w, which is org-refile, then I should be able to go to, all right, the beginner maps. Ah, perfect. Okay, okay. So now if I'm talking to somebody and I say, oh, okay, they want to learn more about customization, I can jump to this, which actually reminds me, what?

00:53:12 newcomers-presets
Newcomer, preset, Emacs. Newcomers presets. Is there like a thing that says what this is? Has anyone written a blog post about it yet? Where do I even find this? Okay, okay. Splash screen. It was in the splash screen, wasn't it? How do I... Okay, display splash screen. Splash screen. That is not it. Okay, how do I find this newcomer presets? So I can tell people, this is what you do in order to do it. Chapter 51 of the manual. Read the manual. Emacs. Newcomer. Okay, newcomer theme. Okay, fine. If I say load-theme newcomers-presets... Okay, I don't actually want to load the theme though. Can I say find-theme? I cannot say find-theme. Can I say... Oh, fine. I load the theme and then it'll be loaded. Interesting. So now is it loaded. Newcomers theme. Okay, here we go. I can just find the function newcomers-presets-mode... Okay, now I see it. newcomers presets theme Okay, line number, flymake, flyspell. That makes sense. So, does it... Let's do it in emacs -q. What do I type here in order to get that to work? load-theme newcomers-presets. Completion is still not there. I want completion as part of the newcomer's theme. I should mention that in emacs-devel. Because M-x, it's not obvious that you should type tab in order to complete things. I just do want to have... ido-vertical maybe? fido-vertical-mode. I mean, this by itself would already be nicer, I think. Okay. I need to suggest fido-vertical-mode, maybe, for newcomers-presets. Okay. And then, want to say... this would be nice to have a crash course: here's how you get a reasonable Emacs for the basic working environment that you want, but it's really better than it was before. And I think newcomers-presets is actually even... It's in Emacs 31, so most newbies will not even be on this yet. Okay, so that is... that's more of a future recommendation, I think. Okay, I got two minutes! I got two minutes before it's lunchtime.

00:57:52 Wrapping up
Okay, where was I? I'm going to go take this transcript for this session as well and then do my tinkering with the spelling and things like that. But I did set out to do the things, I got the things done that I set out to do, so yay! Thank you so much for the chat because that was very helpful. I learned all sorts of things. I learned about newsticker which I've never used before.

00:58:19 Remembering keybindings
I should also note, @maxfriis says, I almost never use operations rectangles, but I remember C-x r and then I can use which-key. So you only need to remember the letter R, @JacksonScholberg says. And @maxfiis says, refer to the operation as an operation or a rectangle. So I remember the R. So if you can get the logic behind the keyboard shortcuts, they become a lot easier to remember. It helps to make your own cheat sheets for that because you can say, all right, C-x 5 is all the frame related things. And here I have which-key kick in automatically after a short while. And it says, okay, these are the things. I've got this like weird highlighting going on. These are the things that start with C-x 5.

00:59:13 Picking Prot's brain next week about the newcomer experience
Prot, if you're still listening, I would like to pick your brain next week about what you think about improving the newcomer experience. Especially since we can take advantage of the fact you came in without a programming background. A lot of people are coming into Emacs for surprising reasons, like they've heard awesome things about Org Mode, and they're not programmers, they're writers, or they do other stuff. Sometimes they're teachers, sometimes they just do things, and Org Mode sounds like a thing that might help their brain from going to twenty different places. What can we do to make it better for newcomers to Emacs? What paths can we build? What resources can we share that people can then link to that helps address that? Prot says, yeah, he's listening, happy to discuss this with me and with all y'all if you want to join us next week. But right now the kid is going to come out and have lunch break, so I'm going to have lunch break too. Thank you for joining me. This was fantastic. I'm going to post the notes, the live stream video will already be immediately available from yayemacs.com. If you search for ye21, then you will find wherever the notes end up. Thank you everyone again, and I'll see you around!

Chat

  • @mehrad42: ​​hand-pink-waving
  • @JacksonScholberg: ​Good morning Sacha
  • @protesilaos: ​Bonjour Sacha!
  • @JacksonScholberg: ​I gave up on Emacs yesterday then I realized I could use VSCode to get things done while I am learning Emacs.
  • @JacksonScholberg: ​First just edit a file.
  • @mtendethecreator: Hello. From the other side lol
  • @j7gy8b: I'm researching making a VSCode plugin actually
  • @j7gy8b: ​for comparison
  • @mehrad42: ​​there is an org-mode extension in vascode that is hoping to do things is Emacs way. i'd stick to Emacs, but it someone find it useful, use it.
  • @charliemcmackin4859: ​​newsticker just happens to be the first one I set up, but seems pretty friendly too
  • @JacksonScholberg: ​Outside of email would be good. I ignore email sometimes.
  • @mehrad42: ​​when I started with Emacs, one of the biggest issues was not to know what each package does. some have a picture or video or asciinema, but most of them don't.
  • @JacksonScholberg: ​That's why I ignore email haha
  • @charliemcmackin4859: ​newsticker-show-news
  • @charliemcmackin4859: ​hah, we are delayed
  • @JacksonScholberg: game over
  • @JacksonScholberg: ​It's gotta be ascii cinema
  • @mehrad42: ​​also infopages are very good source of information. The infopages keybindings are a bit odd at first, so need some explanation.
  • @JacksonScholberg: ​I didn't know there were so many resources for Emacs
  • @JacksonScholberg: ​Post its are great
  • @maxfriis: ​​Try to articulate what you want to do with words that start with the keybinding.
  • @maxfriis: ​​to easily memorize keybindings
  • @maxfriis: ​with the letter used in the keybinding
  • @JacksonScholberg: ​Good idea thanks
  • @maxfriis: ​I almost never use operations on rectangles, but I remember C-x r - then I can use which-key
  • @JacksonScholberg: ​Only need to remember letter r
  • @maxfriis: ​and refer to the operation as an operation on a rectangle so I remember the r
  • @charliemcmackin4859: ​👋 fun stuff
  • @protesilaos: ​​I am listening. Happy to discuss this with you.
  • @JacksonScholberg:​ ​Bye!
  • @maxfriis: ​thanks
  • @mehrad42: ​awesome. thanks
View Org source for this post

YE16: Sacha and Prot talk Emacs

Posted: - Modified: | emacs, yay-emacs

: Updated chapter markers and transcript

In this livestream, I showed Prot what I've been doing since our last conversation about Emacs configuration and livestreaming.

  • 00:00 Opening
  • 04:24 Workflow checklist
  • 04:47 Demonstrating sacha-stream-show-message and qrencode
  • 05:54 qrencode
  • 07:55 Embark
  • 17:14 My objectives
  • 19:00 keycast-header-mode
  • 19:45 Trade-offs when livestreaming while coding
  • 21:24 Trade-offs: seeing less text on the screen
  • 23:52 Lowering the effort needed to announce a stream: Prot just announces it and the blog post embeds it
  • 24:43 Timestamps
  • 27:29 Different types of livestreams
  • 28:14 Reading other people's configs
  • 30:12 Hanging out
  • 31:40 Livestreams for explaining specific things
  • 32:00 Prot on didactic livestreams
  • 34:07 Prot suggests breadcrumbs
  • 37:59 Announcing livestreams
  • 38:58 Embeds: Prot embeds specific YouTube videos instead of the general channel one
  • 39:32 Demo of my new shortcut for converting time zones
  • 41:48 Ozzloy's questions about time zones and QR codes
  • 43:46 Prot on announcing livestreams on blogs
  • 45:25 Processing the recordings
  • 47:15 Commitment devices
  • 48:29 Automating more of the process
  • 51:14 Copying non-packaged code
  • 52:25 Prot on defcustom
  • 55:12 helpful and elisp-demos
  • 56:23 Prot on code libraries
  • 56:50 Prot rewrites functions to fit his style and naming conventions
  • 59:18 Prot's preference for small functions
  • 01:00:23 avy-goto-char-timer
  • 01:02:40 One-shot keyboard modifiers
  • 01:03:29 Toggling
  • 01:05:08 System-wide toggle shortcuts using emacsclient
  • 01:07:25 My next steps
  • 01:08:18 Tips from Prot: small functions used frequently
  • 01:09:06 Maybe using the header line for tips?
  • 01:10:23 Reorganizing keys

2026-04-16-01 Preparing for chat with Prot.jpeg

Questions I'm thinking about / areas I'm working on improving:

  • (Log) Getting more out of livestreams (for yourself or others)
    • You've mentioned that you don't really go back to your videos to listen to them. I was wondering what could make the livestreamed recordings more useful to either the person who made them, people who watched it live, or people who come across it later.
    • Tradeoffs for livestreaming:
      • Plus: debugging help, capturing your thinking out loud, conversation, sharing more practices/tips
      • Minus: Fitting less stuff on screen, distractability
    • A few types of livestreams:
    • (Log) Announcing livestreams
      • You add a post for scheduled/spontaneous livestreams and then you update it with the description; probably fine considering RSS readers - people can visit the page if it's finished
      • Debating whether to embed the channel livestream (picks next public scheduled stream, I think) or embed the specific livestream

      • Now on https://yayemacs.com (also https://sach.ac/live, https://sachachua.com/live)
      • Added timestamp translation to Embark keymap for timestamps, sacha-org-timestamp-in-time-zones
      • TODO: Post template
      • TODO: ical file
      • TODO: Easier workflow for embedding streams
      • TODO: Google API for scheduling a livestream
    • (Log) Processing the recordings
      • I like editing transcripts because that also helps me quickly split up chapters
      • Tracking chapters on the fly
      • Extracting screenshots and clips
      • Turning videos into blog posts (or vice versa)
      • TODO: Automate more of the downloading/transcription, common edits, Internet Archive uploads
  • (Log) Do you sometimes find yourself copying non-packaged code from other people? How do you like to integrate it into your config, keep references to the source, check for updates?
    • convert defvar to defcustom
    • Current approach: autoload if possible; if not, add a note to the docstring

         (use-package prot-comment                ; TODO 2026-04-16:
          :load-path "~/vendor/prot-dotfiles/emacs/.emacs.d/prot-lisp"
                :commands (prot-comment-timestamp-keyword)
                :bind
                (:map prog-mode-map
                                        ("C-x M-;" . prot-comment-timestamp-keyword)))
      
         ;;;###autoload
      (defun sacha-org-capture-region-contents-with-metadata (start end parg)
        "Write selected text between START and END to currently clocked `org-mode' entry.
      
         With PARG, kill the content instead.
         If there is no clocked task, create it as a new note in my inbox instead.
      
         From https://takeonrules.com/2022/10/16/adding-another-function-to-sacha-workflow/, modified slightly so that it creates a new entry if we are not currently clocked in."
        (interactive "r\nP")
        (let ((text (sacha-org-region-contents-get-with-metadata start end)))
          (if (car parg)
              (kill-new text)
            (org-capture-string (concat "-----\n" text)
                                (if (org-clocking-p) "c"
                                  "r")))))
      
    • prot-window: run a command in a new frame
    • Look into using keyd for tap and hold space?
    • header line format with common tips
Transcript

00:00:00 Opening

[Sacha]: This is Yay Emacs number 16. I'm Sacha Chua and today I will be talking with Prot once my alarms stop going off. Yes, yes. I'm going to be talking with Prot later, assuming that all of this stuff works. Let me double check my audio is on. Audio is definitely on. I'm trying a little bit early so that I'm not doing so much last-minute panicking. Let's see what we've got here. I am also trying the new OBS 32 interface for things, so that should be fun. Alright, thank you to phyzixlab for confirming that the audio works. I am so fairly new to this livestreaming thing, but I'm looking forward to seeing if I can do it more regularly because I have a little bit of predictable focus time between now and the end of June. In July, the kid is on summer break and so will probably want to hang out with me all the time. Or not, you know, kids are like that, right? So in the meantime, I am trying to get the hang of scheduling things and since Prot happens to have an Emacs coaching service, I figured I would engage him to coach me on live streaming and Emacs and all sorts of stuff, which is really, you know, making sure that I have somebody to talk to and bounce ideas around with and see where we end up. So the last time, which was, Yay Emacs, when was this? Yay Emacs 10, I had a coaching session with him to talk about Emacs workflows and streaming. So I've been working on modularizing my configuration. I'll explain all of this again when he comes on, but just to get the hang of this. I've modulized my config. I've gotten through hundreds of function definitions and exported them all into individual files. I have in fact even renamed them from my-whatever to sacha-whatever. So it's slightly easier to copy my functions because they won't trample over other people's custom functions called my-whatever. My background blurring is very background blurring. So that's all good. And then I've got a couple of other modifications that I've made. So I've made good progress on this very long to-do list that I had made for myself after his chat. But the kiddo is here. Oh my goodness! Okay, you're gonna go back to school and stuff? You just wanted to drop by and make a comment? Yes. Also, the teacher let me change my name, but not family. They just wanted to add a - in parenthesis. Oh, yeah. Oh, that's good. Now they can refer to you. Post my name and my nickname. Alright, I'm going to test this new thing. Interesting conflict here. The kiddo likes making cameos. I am not sure how I feel about the kiddo making cameos. Anyhow! Where are we? Okay, the mic is unmuted again.

00:04:24 Workflow checklist

[Sacha]: I am going through my checklist. I have this lovely checklist now. It includes, naturally because it's Org Mode, it includes Emacs Lisp buttons that I can just click on to get stuff running. In this case, for example, I can use obs-websocket-el to start recording and start streaming at the same time. So that's all good.

00:04:47 Demonstrating =sacha-stream-show-message= and package:qrencode

[Sacha]: And I want to double check that this message thing works. Let's go see if I can send a message to the chat. Show string. This is a test message that you can ignore. And theoretically that shows up there. That shows up in the chat with a timestamp. So people using video on demand feature where you can go back and just go playback part of the thing can go see it. It would help, of course, if I had the time. And if I expand this. You have the time in the mode line here. It's currently 10:25. But then, my Firefox... Oh, maybe I should just tell you what. I will make this above others. There you go. Fancy. Super fancy. Except this is right where the...

00:05:54 qrencode

[Sacha]: What's the QR code? The QR code just repeats the string. So this will be a little more handy if I have... Let me just double check that it does do the string properly. Come on, show me the thing. Yep. So this is my... In case you're watching this in a mobile device and I show URLs, like for example, let's bring up Prot's configuration here. Let's go to... Let's do, do, do, do, do... Prot. Yeah, here. And then if I say show string and I give it the URL, then it gives you the string and the URL should be in the QR code. So people who are watching mobile. You can do that. People who are in the chat can get it from the chat. It's timestamped so that if I grab the timestamps later on, I can use that sort of for chapters. And just generally all these little conveniences. This QR code is provided by the qrencode package. So it's in Emacs. It's actually characters. There's probably a way to just insert the image. But I thought it was cool. I can't remember who had this technique in one of his videos. Maybe it was John Kitchin? That seems like the sort of thing he might do. Or it might be someone else. Anyway, just these little conveniences because copying text, especially in mobile, or trying to type things... Try to pause the video at just the right moment. It's very annoying. Eventually, I would like to plug it into all the usual Embark stuff. For example, you'll see this later as I go through this stuff with Prot. Log buttons will show messages.

00:07:55 Embark

[Sacha]: But theoretically, it would be nice to have my Embark here. For example, I'm on Embark on an org URL link. It makes sense that... Wait a minute, I do have it. Okay, I think I have it on Z here. Is that a capital Z or a small z? Let's find out. Z? Not a small z. Capital Z. Whoa, look at that! Okay, okay, so I already do have it. Embark is a package that lets you have context-sensitive keyboard shortcuts. And so I have this now mapped so that if I want an org link, I can press control dot and Z and it will send it to the chat and display it on the screen with a message because who wants to type things manually? You know, this is Emacs. We don't do anything manually. And then theoretically, that also should show up in... Look at that! It's showing up over here in my timestamp section using the magic of org-capture. It includes a timestamp and then, of course, with a little bit of math, I can calculate this as an offset into the streaming video file because I started the stream probably at the same time. Anyway, just a little bit of math to calculate that. And then I can get chapters out of it. Theoretically. Or I could use that to index into the transcript and edit things. Hello, Prot! Hello! We are already live. I have just been on screen.

[Prot]: Already live! Great. Yes.

[Sacha]: Panicking. Not panicking. Experimenting with all the fun stuff. I'm now going to share my screen with you so that you can see also. Select window. Let's go to all of it. Screen one? Screen one. I think it's screen one. Okay. Allow. So, theoretically, you should see my screen.

[Prot]: Very well, very well. Looks good, looks good. We have connectivity issues, it seems.

[Sacha]: Your audio sounds choppy.

[Prot]: Yeah, same here. I cannot hear you well. Can you hear me now?

[Sacha]: I dropped my performance.

[Prot]: Okay, okay, do that. Well, very well. Because it seems that our... Yes, okay, I did the same. Okay, so hopefully this will work. Let's see.

[Sacha]: It's an experiment.

[Prot]: It seems more stable now.

[Sacha]: Yes, this is one of the reasons why we're having these sessions, so that you can experiment to see what's possible. And I was just telling stream that I've been having a lot of fun tinkering with a lot of the ideas that I was working on after the last chat two weeks ago. So my goal for this session is to not panic.

[Prot]: I really cannot hear you clearly. I keep getting interruptions, so... It seems that... Yeah, I don't know what we could do. Maybe I can try to leave and rejoin, maybe. Let me exit and rejoin Jitsi, maybe that will fix it. Okay,

[Sacha]: let's try that. Okay, so let me do that very quickly. Quite possibly, I am asking my computer to do too many things. Let's see. I am asking my computer to do too many things, audio-wise.

[Prot]: Okay, we will see. We will find out.

[Sacha]: Let me try changing my virtual mic. How about this one?

[Prot]: No, your audio is still kind of choppy. Why is your audio choppy?

[Sacha]: Let's see. What do you think? Yeti, monitor your audio. Let me check. Not good. It's okay. Live debugging. Here we go. Okay, you are, where are we? You are Firefox. Yes, yes, yes. Okay, I can disconnect the, uh, disconnect the connections. Let me think. Connect the ports of Combined Sink Monitor to Firefox Input.

[Prot]: And while you do that, we will... Testing.

[Sacha]: How are we doing?

[Prot]: There it is.

[Sacha]: Is this slightly better? Testing. One, two, three.

[Prot]: Yeah, let's see here, so... Okay,

[Sacha]: that seems to be good. And now I'm sharing my screen. How is our screen? Hmm, does not like screen sharing at the same time. Let me see what's going on with my memory. My memory is fine. I have memory. Let us stop the screen sharing. How are we now? Is our audio back?

[Prot]: Okay. I can hear you well. I can hear you well in terms of the fact that there is no choppiness now in the audio. However, your voice has been distorted a little bit. It's not a problem. I can hear you clearly, but I just mention it for the sake of your setup.

[Sacha]: This is interesting and I'm not entirely sure how I will go about fixing it at this moment. No problem. It's not really a problem because I hear you well,

[Prot]: so that's enough. I am tempted to suggest the non-free...

[Sacha]: Let's jump over to Google Meet and see if that's any better.

[Prot]: Let's do it. Send me the link and let's do that. No problem. We are already on YouTube anyways. Let me try this. [Sacha] I will send it to you in the Jitsi chat and then things will be crazy.

[Sacha]: It's in the Jitsi chat and we'll see if that works. Does that work? I will also email it to you. That's not the link. Okay. Now I need to see whether this actually works. Oh. Ah! Ah, technology! How does it work? Camera is starting. Camera is not starting. I don't know what it's talking about. Camera is starting. Allow camera. Join now. Okay. Testing. My audio works. Admit one guest. Admit. Okay. Testing. Does this work now? I can hear you clearly. Okay. Now I'm going to try sharing this. Yes. Very

[Prot]: well. And then let's see what happens. Share. Yeah. The moment of truth. Let's see.

[Sacha]: Technology continues to work?

[Prot]: Yeah, yeah, it does work. This is smooth. This works. So let's see. Okay, all right. So it probably means that in the

[Sacha]: future I might actually need to spin up our Big Blue Button server because sometimes the free Jitsi, you know, you're just dealing with whatever you get for free, right? We already have comments. phyzixlab wants to know, well, phyzixlab says, Prot, I'm jealous of your beard. Which Emacs package can I install to have a glorious beard like you? Emacs Genes. Emacs Genes. Y'all can book your own coaching session with Prat. Although technically, I don't mind sharing mine.

00:17:14 My objectives

[Sacha]: Okay, so my objectives is I want to capture and share more, right? And that's great because in the experiments that I've been doing with live streaming so far, I have found myself going on tangents based on people's questions. And theoretically, I can go back and use those transcripts, which I haven't yet. But that could be more stuff into blog posts that are more searchable. And creating opportunities for conversation, which I think you've also been experiencing with your experiments with live streams lately. Because it is nice to have that back and forth when you're demonstrating something and you can immediately show something that was unclear. Quick overview of my timeline. Again, until June, I've got a fairly predictable schedule, except for the times when the kid turns out to have a substitute teacher and is too grumpy to go to school. So just some flexibility still with the schedule, but I am starting to experiment with scheduling chats. So that's nice. And this is our first experiment with it. I'm like, okay, let's try a live stream at this date at this time with somebody who is going to show up also. And then in July and August, since my schedule will be less predictable, then we'll do more spontaneous things like we also have been doing. And then September onwards is probably going to be EmacsConf. So with that in mind, I want to quickly share the updates from the last one. And probably, you know, you will think about stuff and say, oh, yeah, have you thought about doing this? Or, oh, that's good. Try this one next. Or in my experience, so and so and so. And of course, I'd love to hear what you've been learning about also.

[Prot]: Yeah, yeah, yeah, yeah, yeah. Very good.

00:18:59 keycast-header-mode

[Prot]: And I will tell you my experience as well, because based on our last exchange, I also tried keycast at the top, for example.

[Sacha]: Yeah, yeah. It gets out of the way of the closed captions.

[Prot]: It does. It does. Yeah. So it has some advantages and it's always visible and the key and the command is always visible. But I have to get used to it because it was distracting me.

[Sacha]: Yeah, I hear you, I hear you. It's kind of a trade-off, right? And that actually goes to one of the points that I wanted to touch on later where getting the hang of live streaming while coding or while working does require a fair bit of trade-offs. On the plus side, I'm going to see if this works. It should insert a chapter marker so

00:19:45 Trade-offs when livestreaming while coding

[Sacha]: that I know, okay, this part to this part is this conversation. So when you're live streaming while you're doing package maintenance or you're working on config or whatever else, it is slightly more distracting because people come up with interesting comments and conversations. But on the plus side, it is also, as I've seen you do, helpful at debugging. You're staring at something. You're like, what's wrong here? And someone is like, oh yeah, you're missing a trailing slash.

[Prot]: Yes, yes. It really helps. Well, I'm not sure if it helps, though, because the fact that you are talking to the chat means that you are not paying attention to what is in front of you. So it can cut both ways, right? There are times, though, where it really helps. Yes. Where you are completely lost and then the people in the chat are like, hey, that's how you fix it.

[Sacha]: All right. So maybe I just have to A, build up more of a conversation so that we can get those benefits and B, figure out how to run my narration on a separate worker thread in my brain. I don't think it happens. I think I used to be more multithreaded in the past, but I am slightly less multithreaded now. However, it turns out that spending all this time with kids means I am getting better at generating verbal responses that I'm not necessarily, you know, like focusing too much on or just saying like stuff to keep them amused and entertained. Oh, that's quite a skill. Yes,

[Prot]: that's good. That's good. I don't know. But yeah, so there

[Sacha]: are trade-offs here.

00:21:24 Trade-offs: seeing less text on the screen

[Sacha]: The other thing is now that I am using mode to switch on my... I am streaming, do the Fontaine preset and all of that stuff. Now there's like less space on my screen for code. So I had to get used to it again. yes yes yes

[Prot]: yes that that's one of the downsides of course yes like you have to have a larger font so that people can see what you are typing and then of course that comes at the cost of including fewer things on screen Though maybe you could have a little bit of a wider frame, like specifically in your case. I don't know, it's already at the 80 characters already? Yeah, it's already... Yeah, I think in my case, my frame fits about 100 characters. Well, I haven't measured it, but I think it's something in that... Like, yeah, about there is my frame.

[Sacha]: Yeah, it has about 80 characters. So it's about 75 characters.

[Prot]: So in my case...

[Sacha]: All right. And then the stream can tell me if this is still readable, because of course more code on the screen means more code getting written or done.

[Prot]: And just to say also more code on the screen means that it can be easier to debug or write the code. Because you have the context right there. You don't have to go up and down the screen to find it.

[Sacha]: Especially since I'm used to actually dividing my frame into two windows so I can do left and right. And I'm doing this on a standard aspect mode. You have a widescreen, so you're a little bit spoiled in this regard. I only have like two monitors that I'm doing. But maybe that is what I'll end up just using separate frames for. Yes, so slightly smaller font size, and stream can tell me whether this is too small for them. I know people who are older will develop an appreciation for larger font also, so take advantage of this ability to work with medium-sized fonts while they can. So font sets, that's definitely a thing. And then just trying to figure out how I can make it more useful both to other people and for myself and during the live stream as well as after the live stream.

00:23:52 Lowering the effort needed to announce a stream: Prot just announces it and the blog post embeds it

[Sacha]: Now you've mentioned you don't actually go back into your live streams afterwards. You just plug the YouTube video, you update your description so that it's past tense instead of future tense and you republish your post. I think that's your workflow, right? Even less. So I don't even retrofit the

[Prot]: past tense, you know, present tense to past tense. It's like all present tense. It's like I will do a live stream. It will be recorded. You can find it here kind of thing. Okay.

[Sacha]: All right.

[Prot]: And so just to say, though, just to say the reason I do this is because I don't want to go through a three hour stream again because then a three hour stream becomes like a ten hour stream in practice. And this means that it adds friction and it adds to the requirements, which effectively means I will be doing fewer of them. Yeah.

00:24:43 Timestamps

[Sacha]: That's what I'm thinking. Maybe lightweight sort of chapter markers. You've mentioned you just remember this sort of stuff, but since I don't actually remember this sort of stuff, having a way for Emacs to send messages to the stream and also show things in the timestamps. I have a timestamp now. It's nice. It just says Org Capture. And all that will then theoretically make it easier for me to say, okay, let's go find the chapter and then I'll just adjust the timestamps afterwards to say, okay, from this point to this point. If people are interested, they can go in there and they can look at the transcript for more.

[Prot]: I think we discussed this last time as well. You could have a function like start-stream and it starts a timer or it starts recording the time and then relative to that point, any offset and that's your timestamp right away. And whenever there is some event happening, you can type a key and then maybe it gives you a prompt and you write what is it, like just a string and then that is the chapter.

[Sacha]: An org timer will do that kind of insert a timestamp for you. But one of the reasons why I liked having my custom show message thing is that it can display the text on the screen, display a QR code for the text in case people want to copy the function that I'm talking about, send it to the chat so that people using video on demand can say, oh yeah, at around 10:25 or whatever. I'm currently using wall-clock timestamps, which means I need to modify my mode line so that the time starts earlier and people can use that to jump around the thing. And then, so it's like in half a dozen places, which is what org-timer does not get me if I'm just inserting a timestamp here. Anyway, minor, like, you know, little workflow improvements. But it's this whole, as you said, I don't want to go back and spend six hours processing the three-hour livestream. I want to say, all right, this video has some potential interesting things here because these people ask these questions. This is roughly the time when I answer those questions. Ideally, this is the text of the question. Someday, there might even be screenshots and clips. I'm modifying compile-media to make it easier for me to do that kind of video editing from within Emacs.

[Prot]: Oh, wonderful.

[Sacha]: yeah, yeah. But it's all still like, okay, progress. First, I've got to develop the habit of streaming, and then I have to develop the habit of saying, now we are talking about this topic so that it can all get marked everywhere.

00:27:29 Different types of livestreams

[Sacha]: And that got me to thinking, well, there are a couple of different types of live streams and you might have also done something about which ones fit the way that you had to present. One is the, you know, the, I'm going to spend time doing this anyway, which is like your package maintenance, where you will accept a little bit of distractibility for the benefit of having other people around to ask questions and clarify things and stop you when you're getting stuck somewhere. I have something I specifically want to teach and you've done this before with walking through a blog post and just demonstrating things interactively because there's some things that are easier when you're showing it, right?

[Prot]: Correct, correct. ...

00:28:14 Reading other people's configs

[Sacha]: Reacting to other things. In this one, I've started to have fun with because I've been going through your Emacs configuration, which is several hundred pages when converted to a PDF. And I forget, do you actually, like, do you produce a PDF, PDF, like a nicely thingy?

[Prot]: I haven't done it, but that's trivial to do, actually. I could do it.

[Sacha]: Yeah, yeah, so I've also been reading tecosaur's PDF, and his PDF is gorgeous. Like, it starts off with, like, a cover page and and everything. But it's Doom Emacs. I have to translate a lot of things to my specific setup. But now I have literate config envy. Anyway, that's an entire category of live streams here, which could just be me copying interesting things out of other people's configs. Today we are experimenting with a chatting with a guest variety of live stream, which you also do with your Prot asks. Actually, I forget. Are those live streams?

[Prot]: They are not live streamed, but the idea is that I do not edit them. However, if somebody really wants, I can edit it. So the idea is let's go with the flow. Don't worry about it. It's casual, all that. But if somebody says something that doesn't sound right, doesn't mean it or whatever, I'm happy to edit it.

[Sacha]: Yeah. I'm starting to look into how to do that if I'm doing this live and apparently if I set up a sufficiently long buffer in OBS for streaming, like a delay for 20 seconds or 15 seconds, then I can stop streaming and the stuff that happened in the last 10 or 15 seconds doesn't make it out to the public, but it's still kind of...

[Prot]: Living dangerously, yeah.

[Sacha]: Yeah, yeah. Because seeing as I'm still practicing remembering to flip the webcam down when the kid runs in and wants to be on camera, I'm like... My reaction time, not there yet.

00:30:12 Hanging out

[Sacha]: And then other people are like, they just hang out. They're not like, I'm going to do something. They're just hanging out, which I'm sort of starting to experiment with when I'm doing Emacs News on Mondays, because I'm like, I'm categorizing it anyway, but it doesn't require a lot of brainpower because I'm not coding or debugging. I'm just saying, okay, this looks like an Org Mode link. This looks like a miscellaneous link. And then some people just play games, which is fun too.

[Prot]: Yes, that's good. And they want to have somebody on the side, guide them through what they are doing.

[Sacha]: Yeah, or it blends into a hanging out sort of thing. Yes, yes. And it's like, what is the kiddo doing now?

[Prot]: Yeah, the camera, the camera. That's fun, that's fun. Good reaction time. Yeah, yeah, yeah.

[Sacha]: Yes, thank you for your homework. I will scan this and put it online later. This is it. Yes, life. Life.

[Prot]: Putting your reaction time to the test.

[Sacha]: Yes. So in terms of getting more out of livestreams, That's what I've been thinking about lately. I think I would like to do more of these, you know, hey, folks, keep keeping company while I'm coding this or whatever, since you've been having a lot of good experience with that.

00:31:40 Livestreams for explaining specific things

[Sacha]: I would also like to eventually move into more of these. I have something I specifically want to demonstrate, which probably necessitates actually organizing my thoughts. And you've done a bunch of these. After writing a post, it seems like more like recording a video and walking through it. Do you also sometimes do them before writing a post?

00:32:00 Prot on didactic livestreams

[Prot]: I haven't done that but actually, when I write posts, I write them in one go, so maybe I should do a live stream where I actually write a blog post just to show that I can do it. The thing is of course what do you want to communicate, because if it's teaching, like if you are writing it and trying to teach it at the same time, there is a chance that you might leave something out. Some of that detail, some of that nuance. For example, if you want to explain how a form in Emacs Lisp works, let's say if or cond, you may not come up with a very good example live and it may not have didactic value. So even though you know how it works, the communication value is not there. So that it helps for you to write it in advance. Even if it's in one go, again, you can write it, you can read it, and then you can come up with a good example and then stream that. So it really depends on what you want to do. The other day I did a stream, a live stream, where I was writing a package from scratch, a small package. So there part of it was to teach, but also to demonstrate. And there I don't really care if the didactic value is very high. Because even if there are mistakes, it's part of the process. It's not like, well, you will come here and from zero to hero kind of thing, you will learn everything. It's not like that. It's like you come here, you might learn something, but the bar is relatively low.

[Sacha]: I think especially since my mind likes to jump around a lot-- you seem a lot more organized when you're thinking through things, especially if you're saying you write your blog posts straight in one go. I'm like, okay, do this part over here, do that part there. I will definitely lose things, like you mentioned, and I will definitely go back and say, no, I need to do this before I can say that. So yeah, I think I can save that for summer when I might be focusing more on things I cannot schedule.

00:34:07 Prot suggests breadcrumbs

[Prot]: How about leaving breadcrumbs for yourself? Like, I was writing this. Like, write a comment. Basically, I was writing this, I need to remember that, and then you jump off on the tangent.

[Sacha]: I need to use a universal prefix to get the time, don't I? Yes. Leaving yourself breadcrumbs. Yeah, yeah, yeah.

[Prot]: And then you can retrace your thoughts, basically. Like, okay, I was here, I was meaning to do that. Especially when you are streaming, chances are that there will be several comments that are very interesting and you want to get to. And you might be talking to them for 10 minutes or more. And then, of course, if you don't have that or you want to jump off on a tangent, you will eventually forget what you were doing.

[Sacha]: Do you have anything like this already that you're currently doing?

[Prot]: And no, but this is the sort of thing that should be a fun exercise to actually demonstrate as well for yourself.

[Sacha]: I use ZZZ if I just put it in text and I have some things, for example, in my message hooks so I can't send email that contains this. And of course, org has its whole clocking and interrupting tasks that I can use. I just have to have the presence of mind to actually say, oh yeah, now I'm going to go on this tangent and I want to go back to this later on. Leaving myself breadcrumbs is definitely something I need to formalize into workflows that I actually use.

[Prot]: Yeah, that's the thing. And you can also benefit. I don't know. Of course, that's depending on if you are a visual person or not. But you could also rely on color or, for example, include an emoji as well or modify font-lock-keywords to have like something that stands out. Basically, make it clear that, well, this is an interjection. I will just go and then I will be back. Yeah.

[Sacha]: Good idea. Okay. So that will definitely help with the things where maybe I want to demonstrate something and I want to do the thinking out loud so that it's recorded. And just in case other people have any questions, they can come by and ask them. And then I can sort of massage it into a proper blog post, but still leave the link to the video in case people want to hear the stream of consciousness figuring out of all of this stuff. That sounds like maybe a more polished video or blog post with screenshots and clips coming out of this livestream ramble, kind of tangled. Okay, we're going to jump over here. Gotta leave myself a breadcrumb because I'm going to go in this detour to answer someone's question.

[Prot]: There is value to both. There is value to both because the live stream is a stream of consciousness. You can think of it like a bubbling effect. There is fermentation going on, a lot of things happening. And then when you publish the polished, the finished article, that's the distillation effect. So fermentation distillation. So both are useful. Both is good to see and have a sense of what they are up to, what they are doing. Yeah.

[Sacha]: And Charlie in the comments says he likes Emacs' excursions terminology. So if you can think of it as a save excursion, I'm going to go do something and then come back. I am not very good at popping the stack, but I will work on it. Yes. A couple of other things that I want you to pick your brain about. So you mentioned that in terms of announcing live streams, you're like, look, I'm remembering to mark a topic change.

00:37:59 Announcing livestreams

[Sacha]: So you mentioned, okay, you have a post for the scheduled or spontaneous live streams. Then you actually, you don't even update it with the description. You write the description beforehand and you leave it alone. Probably when people get it in their RSS reader, I guess the YouTube embed always just points to, you know, it's either the currently playing live stream or the archived recording of it. And that's that. The link is the same. The link is the

[Prot]: same. Yes. Yeah, on this live page. So now I have

[Sacha]: yayemacs.com and SachaChua.com/live pointing to this page. And there's like, there's a YouTube way to embed just like upcoming live stream, but then it's like fiddly when it comes to, oh, you know, you've got, if you have more than one public up scheduled live stream or whatever, do you use any of this stuff at all where you're like saying a page that's always has your upcoming or current stuff?

00:38:58 Embeds: Prot embeds specific YouTube videos instead of the general channel one

[Prot]: No, I have a generic embed which I copied many, many years ago and I have it in my static site generator. Then the only field that changes is the ID of the video. And this works for live streams as well as pre-recorded videos.

[Sacha]: Okay, so you always give it like the video IDs basically.

[Prot]: The video ID, yes. I can share with you the exact snippet.

[Sacha]: Yeah, yeah. That would be, you know, and you can send...

[Prot]: Yeah. Well, it's public anyway.

[Sacha]: I can steal it off your website. It's fine.

00:39:32 Demo of my new shortcut for converting time zones

[Sacha]: And then I have just added timestamp translation as well. So I can say, okay, you know, let me show it to you. So this is my webpage, right? So here, this is your standard org timestamp. Yeah. And if I open up https://sachachua.com/live, it's also the same as Emacs. Okay, okay, okay. And I find the browser window. Okay. Theoretically, if I say, okay, down here, you click on this, it translates it to your language. Ah, nice,

[Prot]: Nice, nice.

[Sacha]: Because YouTube will do that for the upcoming one if people link to it. But, you know, it's just people. But this is JavaScript, anyhow. And the other thing that I have just added today is I can go onto that in Org. If I press my control dot embark thing, I can use my Sacha Org timestamp in time zones, which is shift W. And it translates it into a gazillion time zones. So then I can mastodon toot it, which I did,

[Prot]: Just to say that copy to the kill ring, okay, yes, okay, good, good, good.

[Sacha]: Because time zones suck. I mean, it's great, but I cannot do the translation and so I am slightly... I'm working on announcing those upcoming scheduled streams while doing all the math so that... well, having emacs do all the math so that I don't have to do the math.

[Prot]: Yes, that's the spirit. That's good. Very good. This is very nice. Is this timestamp always meant for Mastodon or do you have it elsewhere? I think I've seen it in the Emacs news as well.

[Sacha]: Oh yeah, I'm basically stealing the code. I've used it in Emacs Conf and for Emacs News. I used to announce the Emacs News events also. I should get back to doing that. But definitely in the Emacs News and Emacs Calendar, I translate all of the events into multiple time zones for the virtual ones.

00:41:48 Ozzloy's questions about time zones and QR codes

[Sacha]: Line 23 doesn't have a time offset. Okay, someone is commenting. Ozzloy will tell me about it a little bit later. Ozzloy also has a question. Am I creating the QR code with Emacs Lisp? Is it actually text in Emacs? I'm going to go on a quick detour to show the QR code. Yes, do it, do it, do it. By

[Prot]: the way, I will like the stream. I didn't have the chance to do that. A show string. Yes. So here, this is my... Look, I'm

[Sacha]: using line numbers, but they're really long. Yeah, these

[Prot]: are massive. Of course. What can we do? But it's still better because I can say, okay, go to 97, right? And you kind of know where I mean. Yeah. Yeah, so this is qrencode, qrencode

[Sacha]: format, and all of that stuff. It is in Emacs. I think this one actually inserts text. There's probably a way to get it to get images as well. But yeah, so QR codes, because why not?

[Prot]: Yeah, no, that's very efficient. Yeah, yeah, good, good.

[Sacha]: Okay. Yes. So these timestamps are basically in my local time, and then I can translate them to other time zones, and then I can start announcing them, which will probably happen more if I can get my GotoSocial Mastodon thing to be more reliable. But also following your example, I should try putting it in my blog. I just feel like a little weird suddenly going from posting on my blog like once or twice, well, two or three times a week to Hey, OK, every day. All right. In ten minutes, you're going to have a live stream of me talking about random stuff.

00:43:46 Prot on announcing livestreams on blogs

[Prot]: Well, in a sense, it is weird because it's not something you would normally do on a blog, right? Like you have been blogging for a long time and you know how blogging is, right? You just do it on your own. But this streaming culture is a different experience. I think, however, it shares a lot with the blogging way of doing things, which is like, well, this is what I have to say. This is what I think. And I just do it in a slightly different format. And of course, because you are doing the stream, ultimately you control how you participate, to the degree that you participate, what you want to comment on. So ultimately, even though it's a live stream, you can control it in a way that is not that much of a live stream. In the sense that you can be very specific, very structured and be like, you know what, this is my structure, this is what I will do, and I will not run off on a tangent, for example.

[Sacha]: I don't know if it is possible for me to not run off on a tangent. I appreciate people who can be very focused. It's okay. I think my job, I think my goal is more of how do I at least describe the tangents in text form so that I can find them again and so that other people can decide whether this is worth two hours of their time or whether they can just skip to the five minutes that concerns the thing that they like.

[Prot]: Yes, in that case the timestamping would be the way to go. Timestamp plus a brief description.

[Sacha]: Yes, yes, and that actually gets me to... ta-da!

00:45:25 Processing the recordings

[Sacha]: topic: processing the recordings So, yes, as I mentioned, I've been enjoying going back and editing the transcripts because it becomes an excuse to tinker with Emacs and subed-mode, and then because I have this thing for adding a note above the start of a chapter, I can then easily use that to extract the chapter markers for YouTube and all of that stuff. As I mentioned, I'm working on some workflows for tracking chapters on the fly. You know, it's actually really nice having this little button. I used to think, okay, I can just press a keyboard shortcut, but apparently I forget all of my keyboard shortcuts when I'm trying to talk at the same time. So if there's a button, I'm like, I get incentivized to click on it to see whether my code still works.

[Prot]: Plus it functions as a reminder.

[Sacha]: Yes. So it's very helpful that way. And then, as I mentioned, I still need to work on a good workflow for extracting the screenshots and clips so that I can then turn it into blog posts later on and so forth. Right now, I have a pretty manual process for, okay, after the video is posted, I'm going to download it. I have some shell scripts now and the next step of course after this one is going to write an Emacs function that actually and I just finished this part. I have an Emacs function that calls the shell scripts to download the thing using yt-dlp and then start the transcription process but I still manually do the upload to internet archive which I know has a CLI tool so that's next in my list, and fix subtitles and all that stuff, so that's kind of... if I want to get more out of the recordings, that's a general direction I'm going.

00:47:15 Commitment devices

[Sacha]: This is not something that you're currently fiddling with.

[Prot]: Basically, I'm the wrong person for this.

[Sacha]: Yeah, it's okay. And part of these conversations is not so much that I'm looking to you for specific advice on things that you explicitly don't do because it would be against the alla prima. Just get it done and lower the barrier going in. But it's also useful as a commitment device for me to say, alright, I would like to get better at this. I am telling Prot in order to be able to demonstrate the stuff and make myself... If I'm going to see him in another two weeks... Am I going to see you in another two weeks?

[Prot]: Yes, yes, yes. And I will ask. I keep receipts. Yes, yes, yes.

[Sacha]: Exactly, right? So this is also valuable for that. Not just hoping that in your config, which I have now read, that you would have a snippet exactly for this purpose, but more like, okay, I'm telling somebody I'm going to do it, which means I got to go do it.

[Prot]: Yes, yes. And of course, just verbalizing it means that you can also understand it a little bit better. And you start thinking about it. And then it's a matter of writing the code.

00:48:29 Automating more of the process

[Prot]: I'm curious, though, why do you have the shell scripts and not bring all of that into Emacs? What's the advantage of having Emacs called the shell scripts? Or was it just more convenient?

[Sacha]: It's just out of convenience. Emacs does call the shell scripts. The shell scripts are there just in case I happen to be SSH-ing in from my phone. Because I'm downstairs or whatever and then I can just run it from the shell also because I use it not just for my... So I have some shell scripts for downloading the video as an MP3 or as an MP4 or as the subtitles. And so these are generally useful things that I might not necessarily remember to be in Emacs for. So that's definitely, you know... I needed to find this whole process that eventually ends up in a blog post that has all my lovely stuff. where this chat that I have with you is kind of my high-water mark of this is really fun. I would like to do more things like this, where it ends up with transcripts, resources, kind of like the show notes chapter marker indexes. These are automatically extracted from the transcript. Rough notes that we were working on there. The session ... The transcript has speaker diarization. In a video, I got your subtitles to show up in italics and my subtitles to show up in plain text. So now that I have this infrastructure, I feel compelled to make sure I schedule conversations with people so that I use it.

[Prot]: Yes, of course. And that's actually a good reason generally for writing code, ultimately, because it's the vehicle for doing what the code is supposed to facilitate. So the code is just a pretext for actually doing the thing.

[Sacha]: Or the other way around, yeah.

[Prot]: Or it can be the other way around. So the code is the goal, yeah.

[Sacha]: Yeah, yeah, I know. EmacsConf is basically the way that I test emacsconf.el. Hi. It's fine. It's fine. Yeah, so that's my thing for processing recordings. Changing topic. The button. The button. The button. We must press the button.

00:51:14 Copying non-packaged code

[Sacha]: Non-packaged code. So now that I've modularized my Emacs configuration, I've split all the defuns into different files. I have renamed everything from my- to sacha- so that I don't step on other people's function definitions. Now I'm starting to copy things from other people's code to see whether this is actually a viable approach. So this is the way I'm currently stealing something from your prot-comment. Is this sort of like... It seems to work when I go into something. If I go into something, I can press C-x M-; and it does the thing that you define. So this is sort of what you had in mind, right?

[Prot]: This is basically what I was thinking earlier with the comment. Yeah.

[Sacha]: And then theoretically, this sort of structure will also work for other people who have checked out my very large config and they can autoload specific commands out of it and then they can bind key bindings without necessarily importing all of my other set queues and add hooks because that's in a separate file now. The only thing in my list is defuns.

00:52:25 Prot on defcustom

[Prot]: And if you also, just to add, if you also have configurations for your packages, right? You can also have defcustoms for there, maybe with a default value that works for you or with a default value that is generally useful. And then you can also separate that out. So users don't have to pull anything from your configuration, but just pull the package.

[Sacha]: So right now I have... Right now I have my configurations as defvars because I'm lazy. Do you happen to have a function or whatever that you like to use to just convert a defvar into a defcustom?

[Prot]: I haven't done it because it's actually tricky with the type.

[Sacha]: Yes.

[Prot]: You know, the defcustom has the type keyword. And of course, for the most trivial cases, this is easy. Like, OK, it's boolean or it's a string or whatever. But usually it's not that simple. Like if you have an alist, you have to describe what are the key and value pairs or whatever and the elements of the alist. So I haven't done that because it's always on a case by case basis. And many of the defcustom I have will have like a bespoke type because the data structure is really specific. You know, the value they expect. For example, if you are doing something with the action alists of display buffer, like they have a really specific type how you write it.

[Sacha]: Yeah, yeah, I hear you. So I think because I have a lot of strings, I probably can get away with something that just reads the form, smooshes it into a string, adds a string, or possibly what this will end up looking like is maybe a completing read on the type of the function. Sorry, the type of the thing. And then I can just select from several types.

[Prot]: Well, you can make it like you can make it a guess. Like, of course, if this thing is quoted and it's a symbol, it's not a list. Maybe I can have like a choice or a repeat symbol or something like you. You can, but it won't be accurate. Like that would be like for you to fill it in later.

[Sacha]: Yeah. No, I was thinking just more along the lines of Like a completion so that you can select from maybe some of your common types. The actual guessing of what type it is would be an exercise left for future me. But even just not having to remember exactly what the syntax is for repeat would be nice.

[Prot]: Actually, that's good.

00:55:12 helpful and elisp-demos

[Sacha]: Yes. I mean, one of the things that I always find helpful is, like, I think I've got some examples now. I'm using helpful, right? And I'm also using this elisp-demos. So it just tells me, like, I can add more notes here and I can say, okay, this is what a defcustom, that's a repeat of a string or what a const looks like, so that... 'Cause the manual doesn't have a lot of examples sometimes. Sometimes it's annoying to dig through it looking for examples. Usually it has no examples. I think that that's...

[Prot]: if there was one area of improvement, it's that. Keep it as is, because it's high quality, but complement it with examples.

[Sacha]: I mean, technically, all of Emacs is an example, and you can just find something, but...

[Prot]: Yeah, that's why you have the manual, because if I have to dig through thousands of lines of Emacs Lisp, that will take a toll on my patience.

[Sacha]: Yeah, so for anyone who's watching, helpful and elisp-demos is how to add these helpful little notes to your describe-function, because who remembers these things?

[Prot]: Yeah, yeah, yeah. That's very good. That's very good. Yes.

00:56:23 Prot on code libraries

[Prot]: Just to say on the point, if you have packages, this is something I actually do. I just go and reference one of my packages, which I know I have done the research for. So I'm like, okay, how do you do the display buffer action alist type? I will just go to, for example, denote and copy it.

[Sacha]: I will eventually build up a list of examples that I can refer to.

00:56:50 Prot rewrites functions to fit his style and naming conventions

[Sacha]: The other question I had though was do you ever find yourself copying code from people who do not have their You know, they're functions in nice little things that you can just import and autoload. And what do you do about it? Like if they're, you know, let's say they named it, then maybe they named it without the prefix. So it might be possible to confuse it with the standard stuff or they, you know, it's mixed in with the rest of their config so you can just load the file. What do you like doing when you are copying that kind of code?

[Prot]: I will basically check if I can make edits to it. The first thing I would make is probably change the style to be like my style. So I would anyway change it so there is no scenario where I would just copy it verbatim and paste it.

[Sacha]: Okay, so you like to rewrite things and then you fit it into your naming convention because it is now yours.

[Prot]: But also like the style. For example, this function you have over there, like Sacha here, like the one we are seeing now on screen. For example, I would change the name of pargs. Not because it's wrong, but because stylistically it's not what I would write. Then I would change the indentation. Org Capture String, I would put the concat, the line below. I would basically do small tweaks, not because it's wrong what you have, but because stylistically I have a different way of expressing it.

[Sacha]: Yeah, yeah, yeah. Absolutely. I've started to add where I got it from in the docstring instead of... I used to put it in the comment. But as you mentioned, the doc strings are a little bit more visible. So then I usually don't end up looking for updates. But at least theoretically, if I do want to, I could find out who was... Or if I want to credit somebody or see what else they've come up with lately, then at least it's there.

[Prot]: Yes, it's good enough. Plus, when we are talking about these smaller functions, having the link there, I think, is enough. Like, you wouldn't need to go search for updates or whatever. Like, if they have made some changes, chances are it's there.

[Sacha]: Yeah. Okay, so rewrite things, make it fit your style, and add stuff to the docstring because you like to have thorough docstrings.

00:59:18 Prot's preference for small functions

[Prot]: Yeah, yeah, yeah. There are many functions I have where the docstring is longer than the code. I would say, yeah, many of them are like that. But also, just to say, it's because of how I will write the code, where there are many small functions building up to a big one. And so then the docstring explains basically what all these small functions contribute to.

[Sacha]: I like small functions too because I got used to coding on even smaller screens, right? And so anything that could just actually fit in the screen was much better than things that I had to page through. And it gives you many more avenues to modify the behavior because you have more places that you could def-advice, sorry, advice-add :around or whatever.

[Prot]: Actually, this is why I started doing it as well, because it's easier. I had this reason myself. I think it was an org function, which is like 200 lines, and I wanted to really change one thing and I had to copy the whole function. And I'm like, well, if this was a helper function, I would be done by just overriding the helper and I would be good.

01:00:23 avy-goto-char-timer

[Sacha]: I am slowly getting the hang of using avy-goto-char-timer so that I can copy the symbols from elsewhere. Because even if I'm using nameless to insert the prefixes and then I'm using dabbrev-expand or hippie-expand, for which the config I still need to fiddle with to make it absolutely perfect. It's still a lot of typing sometimes, since we like to use long function names.

[Prot]: And which timer variant do you use? Because it has, with two characters, it has the 0 one, which is type as much as you can within a certain time window.

[Sacha]: That's a good question. Where is this?

[Prot]: Char timer. I think this is based on... I think this is the zero. Yeah, I'm not sure. I remember it's called zero.

[Sacha]: So like I can type li and then go to like lj to jump to that one and now I have it so that I can M-j li and then I can press the yank yeah like y like insert from there which is yes when I was when I was stealing stuff from your config, I could... oh let me show you... where is this... So this is your config, right? Well, this is... Hang on a second. Org link preview. There you go. So now the highlights of your config. I can steal stuff from your config and say, okay, M-j, open parenthesis, oops. M-j. Open parenthesis. I can copy the entire line of LK from avy, which is very nice. Very nice. Yes, yes. So, pretty fast side there into avy. I have to slow down and actually focus on doing the keyboard shortcuts because it's a new habit that I want to build, especially since.

01:02:40 One-shot keyboard modifiers

[Sacha]: Also related to one of your recent videos, I'm experimenting with one-shot keyboard modifiers.

[Prot]: Oh, well done.

[Sacha]: Yes. It's a little tricky. I have to get my brain to get used to it. I'm using keyd to do this on Linux. And it's just getting the hang of pressing control and then moving to the thing. It's messing with my brain a little.

[Prot]: But consider that it's a good opportunity to also use two-handed mode, basically. So, for example, C-x, right? Not like C-x. You see what I'm saying? So basically one hand for the modifier. Yeah, exactly. Because that's a good practice in general, even if you use the standard modifiers. Yeah.

01:03:29 Toggling

[Sacha]: And one of the other things that I started doing after our previous conversation and having looked at some of your toggling sort of things, in your config, what's this idea of using the C-z and C-S-z shortcuts? Since who likes to suspend Emacs anyway, right? So now my C-S-z toggles my now.org, which is the stuff that I'm going to be working on, including the stuff that I want to get the hang of using. So this is my, all right, I need to scope it down so that I don't get overwhelmed. These are the things that will, you know, these are the things that I'm trying to get the hang of using. C-z gets me to my stream notes because then I can add things while I'm live, and then C-S-z is what I have as my now, which also gets posted to my web page, sort of like what I'm focusing on. Which, actually, I can reorganize anyway. So I'm liking this toggling because I can press, like for example, if I'm in the middle of my scratch buffer, I can press C-S-z, pop it up, and then pop it back down. And I was watching Joshua Blais's video about he gets to do this sort of like toggling things in and out from anywhere in his system. So now I'm jealous and I need to figure out how to get that working too.

[Prot]: Yeah, yeah, yeah. That's the kind of thing that is really helpful. Like pop it out and then when you don't need it, it disappears.

01:05:08 System-wide toggle shortcuts using emacsclient

[Sacha]: Do you have any of that kind of system level of toggling even when you don't have Emacs as your main application sort of thing?

[Prot]: Via emacsclient. So you can have a key binding to emacsclient, an emacsclient call, and it will bring up an Emacs window from anywhere. I have that, yes. I have it for a few things. TMR mostly, the timer package. So if I am, for example, here, I can bring it up and start the timer without actually switching to Emacs. Okay,

[Sacha]: so that sounds like something I need to look into. It's

[Prot]: in the prot-window file, prot-window.el. I have a macro there, and it's a macro that defines a command. To run in a new frame and once you do something, such as complete or cancel, to close that frame basically. And it's using a condition

[Sacha]: case. It's using a condition case. I think it's the simplest

[Prot]: you can do.

[Sacha]: And then that's a global keybinding on your window manager that runs that and then brings that so that you can pop it up and put it back.

[Prot]: Yeah. It's just emacsclient -e and then the command.

[Sacha]: Oh, that's interesting. Rickard says using space as control has revolutionized their Emacsing. I'm not sure I'm ready to take that step yet. Also, I can probably figure out how to use keyd to use it as a modifier. We'll see. It's a nice big key, you know? You're just tempted to do all sorts of things with it.

[Prot]: Of course, at the keyboard level, you can have different behavior for tap and hold. So when you tap the space, it's an ordinary space. When you hold it, it's control. Maybe that's what they are.

[Sacha]: Yeah, I think that's what's happening there. Look into using keyd for tap and hold.

[Prot]: Yeah, and this is the principle behind the home row mods, the standard home row mods. It's like when you tap, for example, H, it just does H. When you hold it, it's some modifier key.

01:07:25 My next steps

[Sacha]: I have three minutes before the kiddo runs out and goes, mom, it's lunchtime. So do you have any, like, okay, my next steps, I've got stuff that I need to work on in terms of improving the processing of things and automating things. I found this session very helpful for saying, okay, you know, like, in the weeks leading up to it, two weeks leading up to it, it's like, okay, I got to write this code because I want to be able to say I did it, which is good. And as a result, I have all sorts of fancy things now in my Emacs for streaming and also for my config. In two weeks, I would love to have this kind of conversation with you again, if that's all right with you. Do you have any tips before the kiddo comes out?

01:08:18 Tips from Prot: small functions used frequently

[Prot]: Yeah, yeah, yeah. So for the functions you want to write, you want to make the functions be small so you can test them all and make them part of your habit, like start using them even before the streams. So try to use them every day so that you basically have almost a knee-jerk reaction where it's like, oh, I'm doing this and you call the function basically right away. And I don't know if you use the F keys, the function keys for your shortcuts. Maybe those would be good.

[Sacha]: Yeah, I have some of them. But again, it's hard for me to remember sometimes which one I have matched there. So again, it's trying to build it into muscle memory. Probably what I just need is some kind of drill thing.

01:09:06 Maybe using the header line for tips?

[Prot]: How about a minor mode that sets the header line format? You have seen in many buffers where it says type C-c C-c to finish, right? So set the header line format to be like, you know, type, I don't know, Ctrl-Z to bring up the pop-up, whatever, right?

[Sacha]: Yeah, I mean, quick help sort of is that idea...

[Prot]: Yes, quick help would help you do that as well, yeah.

[Sacha]: It's a screen space thing. But if I can find something that I can smoosh together with keycast so that it reminds me of my key tip in this context. Ah, with keycast. Interesting.

[Prot]: That's why I was thinking of header-line-format. So it would be something that will appear there. And of course, the header line works exactly like the mode line, meaning that it can update the content. It's not static. So like your mode line will update information.

[Sacha]: Yeah. Okay. All right. So let me think about which tips might be, you know, like my keyword shortcut of the day focus could be interesting.

01:10:23 Reorganizing keys

[Prot]: But it also brings the point like here, of course, like the keys you have, maybe it's also a good opportunity to organize them differently. Like the header here should prompt you for one prefix key, for example. Like, you know, C-t, let's say, and that's for transcribing or whatever. Right. And it will just have that one there. And then with the help of which-key, for example, you see what you have behind that prefix.

[Sacha]: I have a hard time figuring out keybindings, which is one of the reasons why I like looking at configs like yours and other people. Because I'm like, yeah, I can totally use that as a starting point for keybindings. But then what else do I assign to it? So for example, I've got this. I apparently don't have this. I have this sacha-stream-transient C-c v. That's where I put it now. Okay. Which now has things like OBS and all that stuff.

[Prot]: What's the mnemonic for v?

[Sacha]: Oh, v would have been video sort of thing.

[Prot]: Okay, I see.

[Sacha]: But I have to fiddle with it and the kiddo is going to come out any moment now. So thanks just in case she comes out.

[Prot]: You're welcome.

[Sacha]: Well, it's lunchtime. Thank you for this. I will schedule something else in two weeks. I'm going to try to practice more scheduled live streams and keep fiddling with this workflow. This has all been very helpful. And thank you to the people who also have dropped by and said hello. You can check the chat later. It's fine. Yes, yes. Thanks, everybody. All right. Okay. I'm going to say bye here just in case. Take care. Take care. Take care, Sacha.

[Prot]: Take care, everybody. Bye-bye. Bye-bye. Thank you.

[Sacha]: Thank you everyone for hanging out. That was my chat with Prot. And I will see y'all again maybe Thurs... Well, probably before then. But I will try to schedule something on Thursday for around that time. Who knows what it's going to be about. But yeah, thank you for coming and experimenting with me. Let us end the stream there. Because it's lunchtime.

View Org source for this post

YE12: Categorizing Emacs News, epwgraph, languages

| emacs, stream, yay-emacs

View in the Internet Archive, watch or comment on YouTube, or email me.

Chapters:

  • 00:41:21 epwgraph
  • 00:54:56 learning languages

Thanks for your patience with the audio issues! At some point, I need to work out the contention between all the different processes that I want to be listening to the audio from my mic. =)

In this livestream, I categorize Emacs News for 2026-04-06, show epwgraph for managing Pipewire connections from Emacs, and share some of my language learning workflows.

View Org source for this post

YE11: Fix find-function for Emacs Lisp from org-babel or scratch

| org, emacs, elisp, stream, yay-emacs

Watch on Internet Archive, watch/comment on YouTube, download captions, or email me

Where can you define an Emacs Lisp function so that you can use find-function to jump to it again later?

  • A: In an indirect buffer from Org Mode source block with your favorite eval function like eval-defun
    • C-c ' (org-edit-special) inside the block; execute the defun with C-M-x (eval-defun), C-x C-e (eval-last-sexp), or eval-buffer.

          (defun my-test-1 () (message "Hello"))
      
  • B: In an Org Mode file by executing the block with C-c C-c

      (defun my-test-2 () (message "Hello"))
    
  • C: In a .el file

    file:///tmp/test-search-function.el : execute the defun with C-M-x (eval-defun), C-x C-e (eval-last-sexp), or eval-buffer

  • D: In a scratch buffer, other temporary buffer, or really any buffer thanks to eval-last-sexp

    (defun my-test-4 () (message "Hello"))

Only option C works - it's gotta be in an .el file for find-function to find it. But I love jumping to function definitions using find-function or lispy-goto-symbol (which is bound to M-. if you use lispy and set up lispy-mode) so that I can look at or change how something works. It can be a little frustrating when I try to jump to a definition and it says, "Don't know where blahblahblah is defined." I just defined it five minutes ago! It's there in one of my other buffers, don't make me look for it myself. Probably this will get fixed in Emacs core someday, but no worries, we can work around it today with a little bit of advice.

I did some digging around in the source code. Turns out that symbol-file can't find the function definition in the load-history variable if you're not in a .el file, so find-function-search-for-symbol gets called with nil for the library, which causes the error. (emacs:subr.el)

I wrote some advice that searches in any open emacs-lisp-mode buffers or in a list of other files, like my Emacs configuration. This is how I activate it:

(setq sacha-elisp-find-function-search-extra '("~/sync/emacs/Sacha.org"))
(advice-add 'find-function-search-for-symbol :around #'sacha-elisp-find-function-search-for-symbol)

Now I should be able to jump to all those functions wherever they're defined.

(my-test-1)
(my-test-2)
(my-test-3)
(my-test-4)

Note that by default, M-. in emacs-lisp-mode uses xref-find-definitions, which seems to really want files. I haven't figured out a good workaround for that yet, but lispy-mode makes M-. work and gives me a bunch of other great shortcuts, so I'd recommend checking that out.

Here's the source code for the find function thing:

(defvar sacha-elisp-find-function-search-extra
  nil
  "List of filenames to search for functions.")

;;;###autoload
(defun sacha-elisp-find-function-search-for-symbol (fn symbol type library &rest _)
  "Find SYMBOL with TYPE in Emacs Lisp buffers or `sacha-find-function-search-extra'.
Prioritize buffers that do not have associated files, such as Org Src
buffers or *scratch*. Note that the fallback search uses \"^([^ )]+\" so that
it isn't confused by preceding forms.

If LIBRARY is specified, fall back to FN.

Activate this with:

(advice-add 'find-function-search-for-symbol
 :around #'sacha-org-babel-find-function-search-for-symbol-in-dotemacs)"
  (if (null library)
      ;; Could not find library; search my-dotemacs-file just in case
      (progn
        (while (and (symbolp symbol) (get symbol 'definition-name))
          (setq symbol (get symbol 'definition-name)))
        (catch 'found
          (mapc
           (lambda (buffer-or-file)
             (with-current-buffer (if (bufferp buffer-or-file)
                                      buffer-or-file
                                    (find-file-noselect buffer-or-file))
               (let* ((regexp-symbol
                       (or (and (symbolp symbol)
                                (alist-get type (get symbol 'find-function-type-alist)))
                           (alist-get type find-function-regexp-alist)))
                      (form-matcher-factory
                       (and (functionp (cdr-safe regexp-symbol))
                            (cdr regexp-symbol)))
                      (regexp-symbol (if form-matcher-factory
                                         (car regexp-symbol)
                                       regexp-symbol))

                      (case-fold-search)
                      (regexp (if (functionp regexp-symbol) regexp-symbol
                                (format (symbol-value regexp-symbol)
                                        ;; Entry for ` (backquote) macro in loaddefs.el,
                                        ;; (defalias (quote \`)..., has a \ but
                                        ;; (symbol-name symbol) doesn't.  Add an
                                        ;; optional \ to catch this.
                                        (concat "\\\\?"
                                                (regexp-quote (symbol-name symbol)))))))
                 (save-restriction
                   (widen)
                   (with-syntax-table emacs-lisp-mode-syntax-table
                     (goto-char (point-min))
                     (if (if (functionp regexp)
                             (funcall regexp symbol)
                           (or (re-search-forward regexp nil t)
                               ;; `regexp' matches definitions using known forms like
                               ;; `defun', or `defvar'.  But some functions/variables
                               ;; are defined using special macros (or functions), so
                               ;; if `regexp' can't find the definition, we look for
                               ;; something of the form "(SOMETHING <symbol> ...)".
                               ;; This fails to distinguish function definitions from
                               ;; variable declarations (or even uses thereof), but is
                               ;; a good pragmatic fallback.
                               (re-search-forward
                                (concat "^([^ )]+" find-function-space-re "['(]?"
                                        (regexp-quote (symbol-name symbol))
                                        "\\_>")
                                nil t)))
                         (progn
                           (beginning-of-line)
                           (throw 'found
                                   (cons (current-buffer) (point))))
                       (when-let* ((find-expanded
                                    (when (trusted-content-p)
                                      (find-function--search-by-expanding-macros
                                       (current-buffer) symbol type
                                       form-matcher-factory))))
                         (throw 'found
                                 (cons (current-buffer)
                                       find-expanded)))))))))
           (delq nil
                 (append
                  (sort
                   (match-buffers '(derived-mode . emacs-lisp-mode))
                   :key (lambda (o) (or (buffer-file-name o) "")))
                  sacha-elisp-find-function-search-extra)))))
    (funcall fn symbol type library)))

I even figured out how to write tests for it:

(ert-deftest sacha-elisp--find-function-search-for-symbol--in-buffer ()
  (let ((sym (make-temp-name "--test-fn"))
        buffer)
    (unwind-protect
        (with-temp-buffer
          (emacs-lisp-mode)
          (insert (format ";; Comment\n(defun %s () (message \"Hello\"))" sym))
          (eval-last-sexp nil)
          (setq buffer (current-buffer))
          (with-temp-buffer
            (let ((pos (sacha-elisp-find-function-search-for-symbol nil (intern sym) nil nil)))
              (should (equal (car pos) buffer))
              (should (equal (cdr pos) 12)))))
      (fmakunbound (intern sym)))))

(ert-deftest sacha-elisp--find-function-search-for-symbol--in-file ()
  (let* ((sym (make-temp-name "--test-fn"))
         (temp-file (make-temp-file
                     "test-" nil ".org"
                     (format
                      "#+begin_src emacs-lisp\n;; Comment\n(defun %s () (message \"Hello\"))\n#+end_src"
                      sym)))
         (sacha-elisp-find-function-search-extra (list temp-file))
         buffer)
    (unwind-protect
        (with-temp-buffer
          (let ((pos (sacha-elisp-find-function-search-for-symbol nil (intern sym) nil nil)))
            (should (equal (buffer-file-name (car pos)) temp-file))
            (should (equal (cdr pos) 35))))
      (delete-file temp-file))))
This is part of my Emacs configuration.
View Org source for this post

#YayEmacs 10: Emacs coaching with Prot: Emacs workflows and streaming

| emacs, yay-emacs

I realized that one of the mistakes I often make with Emacs is not asking other people for help, so I experimented with a coaching session with Prot. With his permission, here's a recording of our conversation.

View in the Internet Archive, watch/comment on YouTube, download the captions, or e-mail me your thoughts.

Chapters

  • 00:00 Intro
  • 00:50 Organizing my config into multiple modules and org-babel-post-tangle-hook
  • 04:45 Changing namespace, renaming functions
  • 07:11 Defining aliases for old functions
  • 08:30 Improving my streaming setup
  • 12:09 Keeping things from accidentally airing
  • 14:50 Livestreaming and recording
  • 15:09 Keeping track of interesting moments
  • 18:19 Editing
  • 20:26 Writing
  • 22:34 Packaging
  • 25:40 Responding to email
  • 29:21 Development workflow
  • 29:59 Testing
  • 33:46 Learning and reminders
  • 35:31 Encapsulating workflows into functions
  • 37:05 Popping up notes
  • 38:21 Rediscovering things in my config
  • 40:31 Catching up on Emacs developments
  • 41:29 diffs
  • 43:08 Thinking about the community
  • 44:00 org-link-preview
  • 45:31 Prioritizing things to work on
  • 46:39 Modelines
  • 48:50 Themes would be nice to have per-frame
  • 49:27 Livestreaming conversations with Prot
  • 50:11 Getting together
  • 54:44 Namespaces
  • 55:46 Verbose function names
  • 56:45 Naming conventions for ERT tests
  • 57:14 shorthands
  • 58:27 Bisecting config in multiple files
  • 58:46 "I don't write bugs."

Rough notes to clean up over the next little while

  • Meta: learning things
    • Don't try to remember too many things
    • Build a command that does those for you
    • Ex: preparing for videos, prot-streaming-mode
      • line numbers
      • disable spacious padding
    • long names: more chances to match it
    • new frame and then making it disappear: org-capture, timer; I can use that for notes
    • Tip: prefix keys are also helpful; for example, replace C-z, no one needs to suspend Emacs anyway defvar-keymap :prefix defines how it should be called as a command, which is good for handling updates to keymaps as well
  • Emacs Lisp development workflow
    • diff-buffer-with-file buffer-file-name - diff current buffer
    • Renaming a symbol
      • single file
        • substitute
          • also noting function aliases, obsolete
      • multiple files? -wgrep
        • keyboard macros from dired and substitute
    • Bisecting config in modules?
      • "I don't write bugs… Of course I'm kidding."
      • Ah, I can probably use bug-hunter with a setup file
    • Testing
      • I think I just need to get the hang of:
        • ERT, modus-themes-test–modus-themes-load-theme
        • nameless -> shorthands
        • Tip: Docstring as a declaration of intent; the docstring is the source of truth, not the code. If you write more than the minimum, then you are helping future you.
        • setting things up at the beginning (Makefiles, continuously running batch mode tests, etc.)
        • navigating to where I want to write the tests
        • mocking functions
  • Making more of my config reusable
    • "I implement the package that I want."
  • Workflows for writing, making videos, livestreaming
    • wide monitor is awesome
    • different font configuration with fontaine
    • private stuff:
      • private vertico
      • turning off preview for consult
      • keeping files organized
    • marking chapters and highlights: using his memory for this
    • just capture a timestamp and possibly a note
    • could also just do the offsets manually by saving the time
    • display line numbers to help people orient themselves and so they can mention it in the chat
    • writing: splitting it into modules helps
    • Ooh, idea, theme for streaming
  • Other stuff I forgot to mention
    • TODO: link preview - update my code for svgs
    • Emacs modeline? Smaller lighters, buffer name, view narrowed, read-only, keyboard macro;
      • streaming, microphone

Transcript

Transcript
  • 0:01: Intro: Sacha: Fantastic, this is great, I finally get to talk to you. I appreciate that you blogged so quickly about some of the things that I mentioned, and we can certainly dive right into that, or you have a lot more experience with how these conversations go, so I can let you take the lead.

    Prot: Since you put in the effort to write, we already have a very good structure. The idea is, let's have your screen, so you can share your screen with Jitsi.

    Sacha: Yeah. I will share my screen.

    Prot: And we can go right into it. Let's see. So if you hover over… Okay, yeah, you have it.

    Sacha: yeah oh you know if if at some point I should be really like fancy… Future session, we should get crdt working because that's fun.

    Prot: Ah, yes. Oh, that would be nice. Yes.

    Sacha: Yeah, that would be nice. All right.

  • 0:50: Organizing my config into multiple modules and org-babel-post-tangle-hook: Sacha: So I've been making good progress in splitting up my config into multiple modules. I just have to iron out a couple of things like do I actually have to load the autoloads from the user list directory or does it automatically take care of that? Because sometimes it doesn't seem like it's doing the thing. Anyway. It's making good progress. And in fact, I came across something that I'm not sure you know about yet, or maybe you know about it and you decided not to do it. I found out that, so, okay, so here's the context. You know, when you do your literate config, you have your modules and they're actually just one big file, like one big source block with a commentary and everything in it. Yeah, yeah. So I found out that you can use a hook if you want to, to add stuff to the tangled files afterwards. So the way I set it up with my config is I still want all the different functions scattered all over the place because I'm not yet as organized as you in terms of the modules. So the org-babel-post-tangle-hook here, post. Yeah, yeah, yeah, post

    Prot: So what did you do with that? Let's see.

    Sacha: and boilerplate… has that boilerplate here we go so what it's what this does is when it tangles it it then goes back into the file and it inserts all that extra text and the footer into the tangled files so I still have my links to

    Prot: Nice.

    Sacha: the different source files where it comes from. So this is the section where it comes from but I also have all the extra lovely commentary and stuff so I'm like…

    Prot: Ah, that's smart. That's good. That's good. Yes.

    Sacha: That way, you don't have to keep repeating things. Although I guess if you really wanted to repeat things you could you could theoretically have the license just as a no web reference and then have it go in there automatically. anyway so I thought that was really cool so I'm making progress on the things that I had mentioned in the in the blog post about organizing my config into multiple modules and other yeah…

    Prot: And how far are you in that project? How far are you?

    Sacha: Let me see. I can look at the sacha.el here and I can do an occur on the files that have the lines that have the defun. I only have 482 defuns to get rid of. This is already a lot less than what I started with because like you, I have a very large… Almost 40,000 lines in this sacha.org.

    Prot: Yeah, yeah, that's massive. Yeah.

    Sacha: It's fun and it's interesting. It is a little reassuring to know that people still rely on your published modules instead of actually, like, do people take your config? I know you've got stuff in the config that makes it possible for people to just load it and add their customizations on top, but do you hear from a lot of people who do that?

    Prot: From a few of them, yes. And this is why I actually created those customizations. But I must say, I have been trying to

    Sacha: Yeah, yeah.

    Prot: make it more difficult for them. So I used to have a use package, but now I disabled it on purpose and I have my own macros, so that somebody doesn't just copy-paste. And I don't do this to be mean, but I do it because this way somebody will have to think about, like, okay, what is this? What am I doing here?

    Sacha: yeah I figure making making them still do that okay what am I doing here while still being able to automatically load all the function definitions will probably get them over that you know like make it a little bit easier for them so at least that way like right now it is difficult to copy things from my config like like you're so like okay maybe this is a feature but you know, maybe changing it will be nice.

  • 4:45: Changing namespace, renaming functions: Sacha: The other big thing that I need to do with my config is I'm thinking about shifting everything to the sacha- namespace instead of the my- namespace, which is going to be a lot of renaming, which is actually, it was actually the question that I had about renaming things, not necessarily coming up with clever names that have good acronyms like you do. And I love that the humor that you have in there, but like, like just mechanically, are we talking wgrep is like, is there a more modern, emacs 31 way to rename things? Am I just using erefactor or like replace-regexp? What do you do when you need to rename a symbol in possibly multiple files?

    Prot: If it's in multiple files, I do the grep approach. So it's not that sophisticated, but it works. Because the thing with the multiple files is, and it goes also to what you were telling me in that article, is first you organize, and then you refactor. It's that idea. The multiple files will not have a lot of extraneous information. You will not be matching, at least in theory, you will not be matching too many false positives.

    Sacha: Yeah, and if you're doing a single file,

    Prot: So you won't have to sort it.

    Sacha: what do you like to do?

    Prot: I have a package called substitute. One of the ways I do it is just substitute the symbol at point. But of course, this is just a minor convenience. You can do that with a query-replace. I'm not saying that you really need the package. But the idea is that you do it and you know that it works. Like, for me… I know that it works in the file. So for me, that's very reliable. But the other thing I should mention is keyboard macros from dired combined with substitute. So you start from a dired buffer, and you go file by file. That's the general idea. And in each file, you will perform, for example, a search to the symbol. Once you are on the symbol, you do the substitute-replace command, and then you move to the next file. So that is the workflow. And I do that a lot, for example, with my themes, because they have a lot of repetitive code, like each theme.

  • 7:11: Defining aliases for old functions: Sacha: Okay, the other thing that I was thinking of as a workflow improvement here, because I'm sure that I'm going to keep calling them by their old names, especially interactively, like have a lot of commands that go off the meta x, my do this and this and this is I might also need to think about adding a function alias automatically. And one way I was thinking of doing that was just, you know, iterating over our array and bulk defining aliases so that all the sacha- stuff is now named my- stuff but I was wondering if that was a or actually also manually inserting the like well not of course manually but but creating forms for like defining the aliases somewhere but I was wondering if this was something that you already did as part of your workflow like do you when you rename things okay

    Prot: No, I haven't. When I rename things for my packages, I do use aliases. But for my own code, if I rename it, basically, it's

    Sacha: yeah yeah

    Prot: just the latest name. So I don't try to keep aliases around. Because I eventually use a similar name, it won't be very different.

    Sacha: huh all right yeah yeah I mean like it's it's there you

    Prot: But what you said about the obarray makes perfect sense.

    Sacha: might as well do do it automatically right okay all right that's me oh okay okay I can

  • 8:30: Improving my streaming setup: Sacha: I can do my jitsi thing so I can see everyone and the screen at the same time the screen is very small okay so so that's I do have a dual monitor setup, which

    Prot: Yeah, you need that dual monitor setup,

    Sacha: is why I was like, OK, maybe I can start looking at your B-frame things. And in fact, in the minutes before I called, I figured out how to use MasterChat CLI to get the YouTube live chat into a command line program, which means that it can be run from call-process or make-process or other such wonderful things. So now it's an Emacs buffer. And then I was thinking, okay, maybe I'll make a pause frame or like a B-framed like dedicated frame for it so that I can have the chat of a live stream displayed within Emacs because you know, it's Emacs. We should do that. Yeah, yeah, yeah.

    Prot: Nice. Yes, of course. And you can have it in a side window dedicated buffer.

    Sacha: Although I might actually have to write my own like Node.js program so that I can also send text from it, from Emacs. I think the masterchat CLI, it only displays, but the library that it uses, if you pass it your browser cookie, you can use it to send messages back to chat as well. The reason I had liked Twitch before was because Twitch had some kind of IRC type thing that you could connect to. And then that meant, of course, that you can use ERC from within Emacs in order to send stuff to it. Anyway, live streaming and chatting, I've also been getting into that lately. And I was going to pick your brain about this whole like workflow for making videos or live streaming them. And more importantly, going back afterwards and remembering to post them or edit it, in case you forgot something or whatever. So if you happen to have any tips or the things that you like about your setup, I would love to hear about that.

    Prot: Though in my case, the setup is really simple, and I admit that I could improve it. But it's really simple right now, where I have a wide monitor. So it's one display, I don't have two, but it's like 2500 pixels instead of 920. So I have a little sidebar on the side, and there on the sidebar I put OBS, for example, and I put everything I need there on the sidebar. And then I have enough space to have whatever it is I am displaying and maybe another widget on the side. So that is in terms of the physical layout of the monitor here. And then in terms of the Emacs side, I don't have a lot going on. I have one package to load the different font configuration. So when I do streaming or videos, I will load basically the presentation setup.

    Sacha: It is a spontaneous.

    Prot: That's Fontaine, exactly. But again, it's not a matter of the package. You could have a function that just changes the default phase, the height attribute.

    Sacha: I have this monitor and then laptop, so this is my workaround for not having enough space in this desk for a super wide monitor. My husband has a super wide monitor which I like to borrow during EmacsConf. Hello child who is wonderful and likes to make cameos during my EmacsConf. Okay, I'm going to hug you.

    Prot: Hello!

    Sacha: Yes. So okay, so live streaming and then you just basically hop on the stream and talk about stuff.

  • 12:09: Keeping things from accidentally airing: Sacha: I know you've mentioned things like just starting Emacs with your Scratch buffer, but yeah, how about the interesting workflows for not accidentally spilling secret stuff online?

    Prot: Part of that is… so I use Vertico normally for my completions. I have some configurations for private Vertico, where by default, it doesn't display what Vertico normally displays. It's just a blank minibuffer, the way it is with the default Emacs minibuffer UI, right? But what happens is as soon as you do TAB or as soon as you move up and down, then it displays Vertico. So that, that is one way for me to make sure that I'm not showing anything I didn't want to show. The other thing is when I do videos, I don't use consult actually, even though I like it, because of the preview functionality. I don't want to be switching between files and then consult shows us something which is private. Right. So. So the private VertiCo, it's a small extension that I have with a few functions for Vertico.

    Sacha: I've been thinking about modifying the console preview states so that I can elide more, I can skip over things that might be private. And things like, I already have a filter function for marginalia so that it doesn't show me the values of variables that might be private. But yeah, just turning off all these things makes it a little bit easier to say, okay, I'm just going to jump on the live stream and do this thing. Some of the other fun stuff that I've been doing along the

    Prot: So there is that. And for private, of course, the other thing with privacy is that you want to have a generally good sense of where you put your files. So for example, in my pictures folder, I know that I don't have anything private there. But there are some sub folders which are like personal. So I know not to go there. So it might happen, I need to show a picture, okay, I just go to the pictures folder, and I show it, no problem.

    Sacha: lines of keeping things organized is if I have a stream tag on a task, I know that's safe to show on screen. And then I modified my Org jump stuff. There's a hook that you can use to narrow things to just that subtree. So at least I can jump to it and not have to worry about the rest of the context in my inbox. Trying to slowly slowly get the hang of this

  • 14:50: Livestreaming and recording: Sacha: Okay. So it's live stream. Do you like to live stream and record at the same time locally or just live stream and then go into the YouTube thing afterwards to download?

    Prot: I just do the latter.

    Sacha: It takes a little bit of a while,

    Prot: I just download it from Youtube afterwards

    Sacha: so I'm like… I could get started on the transcription.

  • 15:09: Keeping track of interesting moments: Sacha: Do you have anything to keep track of interesting moments that you want to revisit, or do you just, I don't know, skip around in the video, look at the transcript, whatever?

    Prot: I remember, I know this sounds bad, but I remember.

    Sacha: People with good memories, boo!

    Prot: And generally I try to also sharpen my memory. So whenever I can practice something, I will do it like that. But otherwise, if you really need to take a note of something, you can always have a small function that just records the timestamp. Like, what is the current time? And then you know when you started, so you will know where you are in the video. Like, it would be a very simple function that simply prints the current time, you know, format-time-string,

    Sacha: Yeah. I just have to write something that gets the time

    Prot: in a buffer at the bottom of a buffer. And that buffer is like your interesting moments kind of thing. And if you really want, you can make that prompt you for some text, like here is the timestamp and here is like, you know Prot said a joke or whatever, you know, like…

    Sacha: started from YouTube and then calculates the offset automatically, so that I can say okay, here are my chapters roughly.

    Prot: Yeah, that's even more fancy. Or you could do the other thing, which is all local, which is the moment the stream starts, you hit this command, like you invoke it, so it resets the time and then it performs the calculation locally. So you can do calculations with time in Emacs. So you can perform that as well.

    Sacha: Yeah, that's really straightforward. Okay, so that's definitely something that I'm going to want to think about, because video is great for enthusiasm and showing cool stuff that you might otherwise forget to mention, but it's just so slow to review afterwards.

    Prot: Yeah, of course, of course, of course. Just to say another thing with video, what I have found that is really helpful is to display line numbers.

    Sacha: Oh yeah? Huh.

    Prot: Me personally, I don't use line numbers, but I have found that when I am displaying something that others need to follow, line numbers help them. Because for example, earlier you were jumping around trying to find that hook, you were…

    Sacha: Oh yeah, yeah, yeah. Okay. Display now.

    Prot: And of course, me, I have experience, so I kind of know what you are doing, but somebody who is not really into it will be like, what is happening? Why are things moving up and down so quickly, right?

    Sacha: Okay. And they can mention it, too, in the comments,

    Prot: And they cannot track where you are.

    Sacha: which is nice.

    Prot: Yes, yes, of course. And also, when you are displaying something, you can say, look, on line 100, what I am doing, for example.

    Sacha: I have to steal your config for the highlight line

    Prot: And it's easy for everybody. Yeah.

    Sacha: priority because I've been using the highlight line for that. But sometimes it overwrites things. I'm like, OK. Today it is well-behaved, so I'm glad for that.

  • 18:19: Editing: Sacha: Making videos, all right. Just go ahead and make the videos, you just do it pretty straight, you don't do a lot of editing afterwards, I'm hearing, following the same kind of philosophy that you use for your blog posts?

    Prot: That's the idea.

    Sacha: All right, I should just go do things and not worry about whether the live stream demo that I just made of how I can highlight the PDF of your literate config and extract the stuff into whatever has a bug in it. And I'm like, oh, I just demonstrated that. It's okay, I can update it in the show notes. Oh, that's true, especially since

    Prot: Or even better, you do a second video afterwards, a follow up.

    Sacha: now I figured out that you can use org-pdfview view to link to pages in the PDF. So now my index.org has the highlights from your config, and it takes me back to the page that it was on. Very very cool stuff.

    Prot: That's nice.

    Sacha: Okay, so I just gotta do it.

    Prot: I think Org-noter also is another package you could use for that.

    Sacha: Yeah, probably. and then I just need to get… I think I've got PDF tools or PDF view set up. And then reader of course looks very interesting also. So I've got to tweak my config a little bit more to get it running because it has an external dependency. Anyway, so just got to do the live streaming. I was delighted. People have actually been dropping by and commenting or chatting during the live streams, which is great because I get to remember, oh yeah, I should explain that part, taking it for granted.

    Prot: The thing with a live stream,

    Sacha: So all of that is good stuff.

    Prot: because it's something you also wrote, like getting used to talking to yourself, right? So, of course, that takes some practice, but I think, yeah, you have the hang of it already.

    Sacha: Something is ringing. Hang on, sorry. I forgot. That was just my reminder that the kiddo is back to school. Virtual school is fine. Anyways, OK, so so just got to do it.

  • 20:26: Writing: Sacha: Thank you for the tips. This is very helpful for

    Prot: You're welcome.

    Sacha: writing. I'm getting better at actually remembering to include more bits and pieces from my config, and I'm sure that now that I have them in different files, it'll be easier for me to then write the post that links to, oh yeah, here's the five other functions you need in order to make this little snippet work. But do you happen to, knowing the kinds of stuff that we like to write about, do you have any other tips from your workflow?

    Prot: When it comes to sharing code like that, I already noticed while you were moving around that you have many things like my-consult, my-org, etc. What helps there is to just make those their own module right away. And from there, you know that, okay, this is either self-contained or it has an explicit require, so I can already know where I need to search for dependencies. So it's really that. It's because, for example, if you take just a my-consult function, right, of course, you know by the name that it depends on consult, but you don't know if it depends on my- common functions, for example. Right. Whereas if you have it in its own file, there will be a require at the top. So, you know, OK, require my-common-functions. And that way you can tell, okay, there is a dependency here. So then when you are to share this function, you can search for, okay, my-common-functions, is it mentioned here? Yes or no. And then you know what the dependency is.

    Sacha: And I think this process of moving things into those separate files will make it easier for then, for people to say, okay, yes, I do want to try that thing. Let me check out the repository required, just load-file that particular file and then be off to the races. So we'll see how it works. I don't know if people actually… Sometimes people mention borrowing stuff from my blog. So maybe people are actually reading the non-Emacs News posts. We'll get to see that.

  • 22:34: Packaging: Sacha: Sometimes I feel like a lot of my tweaks are very idiosyncratic, right?

    Prot: Yes, what I found that has helped me is I implement the

    Sacha: They're very suited to the particular need that I have. And then it's difficult to say, OK, if I were going to generalize this for other people, what kind of defcustoms will I need? What kind of options? And there's always that trade-off between, yeah, but I just want to implement the next little thing that I want to make for myself versus, well, if I put in the polishing effort, then possibly other people could use it, and learn from it, and then contribute their own ideas, and then everything gets better without me having to do the work myself. So it's a bit of a balance.

    Prot: package that I want. So for example with denote, but this applies to everything, denote version 0.1 is the package that I wanted. So basically, it works for me. Ever since, I have been adding other things that people want, which are, of course, good things to have. They improve the package, but I have already been using the package that I want since the beginning. So ever since, it's just adding stuff and learning about how people use it and refining the code, which everybody benefits from. So whenever you have an idea that you are like, okay, this may be too idiosyncratic, don't worry about it. Make it into a package, and then what other people need will become apparent, and then over time it will change, but the core package is still what you want.

    Sacha: Although it is interesting to see, for example, with the university calendar, institution-calendar thing, it's like, okay, you can get it to work for a small number of institutions, ELPA wants… they want it to work for everyone, everywhere, all the time. Okay, that might be too general. You might need to actually have lots of other people saying what they need in order to make that happen in the first place, right?

    Prot: Which at that point, of course, what you want is to write the documentation. So for example, with the institution calendar, I wrote a couple of examples. Okay, how do you extend this? And yeah, I think that helps. But then of course, you cannot cover every use case like people have to also make contributions if they really care about.

    Sacha: Yeah, so I think at the moment, I've been writing for n equals one, the audience is really just me. And occasionally I hear from people who are like, oh, that's an interesting idea, let me adapt it. Sometimes if I'm really lucky, they will go and write their own package on top of the stuff that I shared, which is the ideal situation, because then I can just like, oh, yeah, I'm going to borrow that and use it. It'll have more features and they're in charge of dealing with that. But I suppose at some point it behooves me to practice. OK, I'm just going to write it as a package, pretending that this is something, as you said, this is something that I want to be able to install and use myself. Then if other people find it useful, it's a lot easier for them to experiment with and then add on to.

  • 25:40: Responding to email: Sacha: Which goes to my second thing. Doing this and making things open to other people probably means being more responsive to email. And this is, for me, this is a bit of a challenge. I'm starting to feel less time-starved, which is good. I'm starting to actually be able to schedule things. One of these days, we should probably see if we can schedule a Prot Asks thing. I don't know if I can do two hours, but maybe I can do one hour or whatever. Anyway, the rest of it involves actually doing

    Prot: For sure.

    Sacha: the responsible thing and responding to issues and emails and whatever. It's always a bit of a trade-off, like, oh, do I implement this other crazy idea I have, or do I answer my email?

    Prot: For that, of course, it's a challenge. I must say that a lot of the maintenance work I do is via email. Or email or Signal or Telegram. People will ask me, hey, Prat, what is this? And many of the issues are not with my package. I had an issue earlier with the modus themes, no, the ef-themes, and eventually it was something to do with the user's configuration of some function of center tabs. But I had to go into it and check. So, of course, there will be that. But I must say, it's not too bad. It's not a big issue. You can always have in your email, like, hey, please don't use this for issues. And it's not a replacement for that. Just use the issue tracker.

    Sacha: I know I just have to… I think I just have to like reframe my perspective. This is a gift. Other people are taking their time and effort to do this. It's wonderful that they're trying things out and putting their… actually doing things themselves and then reaching out in case… 'cause it would be nice to get things working on more people's computers. I think that the stuff that I've been building around learning languages and doing voice input into Emacs probably… There are a lot of these things already, but they tend to also be very individual workflows and individual setups. So it'll be interesting to get to the point where we can start to even have a conversation with shared code.

    Prot: About the individual workflow, again, it's not a problem because what is individual now will eventually become kind of a standard workflow. Think about org, the beginning of org. You have Carsten Dominik, who is like, you know what, this outline mode isn't enough. I need more stuff on top. And eventually we have Org. In the beginning, I imagine org was basically Carsten's org, and it became this uh this package that everybody can use however they feel like.

    Sacha: I used to maintain Planner Mode before Org Mode got super popular and I remember feeling very embarrassed when someone very, very kindly said "I appreciate the work that you do; incidentally, the latest update kind of deleted a lot of my notes." So this is like, when you make something that other people use, sometimes your mistakes will affect more people than just you. But I'm hoping now that now that the disks are in the spaces of terabytes instead of whatever, people are just backing up everything and version controlling everything and everything will be fine.

    Prot: Yeah, of course, of course. Writing packages, of course, is a responsibility. The upside, though, is that because you know that it is a responsibility, you try to write cleaner code at the outset. Whereas if it's just for your own configuration, you're like, okay, this will work and I will fix it later.

  • 29:21: Development workflow: Sacha: Yeah, and that actually brings me back to this Emacs Lisp development workflow thing. So I think one of the things that I just need to do is I just need to set up the Makefiles and the snippets and the shortcuts to say that if I'm starting a new proto-package, the thing to run the tests is there, and whatever it is that maybe even continuously runs the test when I make a change, and lets me mock up functions so that I can test some of the things that might be more interactive or might require deleting files or whatever. It's just changing my buffer configuration and whatever.
  • 29:59: Testing: Sacha: So I occasionally write ERT tests when I feel diligent. Sometimes I'm starting to write the test first and then write the code that makes a thing, but if you happen to have any parts of your workflow that you particularly like when it comes to testing things, I would love to hear about them because I haven't gotten to that part of your config yet

    Prot: Yeah, so I don't have a lot going on for that. So it's simply ERT. But what I do with the tests is really basic. So ERT, M-x ert, and then I pick the test that I want. And I must say that when it comes to tests, I can be better myself. So there are some packages I write where they have good tests, but there are others that have zero tests. So I want to reach a point where everything has tests, but it takes a lot of work.

    Sacha: Yeah. I mean, like every so often I feel like very, very diligent and I'm like, okay, let's do code coverage. So I can see things with undercover. Let's write a function and make sure there's a test associated with it. And let's write a keyboard shortcut that lets me jump from the thing to the test that's associated with it or to run it. And in fact, I still need to get embark to do all these things for me so I can be looking at a function and say just rerun the test for this, please.

    Prot: Just to say one low-tech feature that has helped me a lot, low-tech, Is i use the docstring as a declaration of intent. So in the docstring, I say what is the function or the variable meant to do, like what is it meant to provide. And then if I look at the code and I'm like, ah, this doesn't work, I know that the doc string is what I wanted. It's never the code. So there is this idea that the code is a source of truth. For me, it's the opposite. It's like the doc. It's the specification. And then the code is… I was wrong. I was sloppy. I wasn't paying attention. I missed something or whatever. And the reason for that is the following. It's because with the code, you may have used the symbol wrongly, or you may be calling something that you don't mean to call, or there is another function. Or, for example, you use mapc instead of mapcar, so you don't get the return value you expect, that sort of thing. So something, basically you don't deal with sloppy problems. So you don't have confusion there. You know that, okay, the source of truth is the docstring. This is my intention.

    Sacha: I should do that more often. Now that I've changed my yasnippet for inserting functions to automatically have the docstring, I feel a little guiltier when I delete the docstring, so I am compelled to instead fill it out. But if I specify it in more detail, as you do with it becoming the statement of intent, then I can be like, OK, let's try that. It's a good practice. And then I can write the test.

    Prot: And the thing with docstrings is that, of course, you are

    Sacha: Yeah? This is me.

    Prot: motivated to just write the minimum necessary so that you don't get the warnings, right, from checkdoc. But if you write more, then you are rewarded yourself. It's something that helps you, future you, and of course other users, because you always have to consider yourself as basically a user. I don't remember why I wrote this six months ago, so of course having the docstring there, actually spell it out, helps me.

  • 33:46: Learning and reminders: Sacha: I definitely have problems with working memory and long-term attention. Which actually touches on this other thing that I mentioned in my post, which is, in your experience coaching other people and also in your personal practice, what are you finding as good ways to keep reminding yourself, okay, these are the keyboard shortcuts I want to internalize, or this is the the workflow tweak that I wanted to try naturally. I was thinking, maybe I make an Org file or maybe I make a quick help thing or whatever. But it's always interesting to hear about other people's workflows.

    Prot: What I find most useful is to not try to memorize too many things, but whenever you are in the flow of, oh, this is a process that I want to be doing, to actually implement it as a command or whatever, as a package or whatever, like basically don't try to memorize the steps and of course the key bindings. Try to build a function that does those for you. A command basically that does those for you. So for example, to be concrete, I mentioned earlier that for video purposes, I will enable line numbers. And I will also enable the line highlight. And I have another thing where I disable spacious padding. So the package I have. And all this, of course, I know the key binding. So it's F7 and F8 and F6 or whatever, right? But I'm like, I cannot remember all that. I will just write a function, and it will be prot-streaming-mode. And I enable prot-streaming-mode, and it does what I want it to do, and then I disable prot-streaming-mode, and I'm back to where I need to be.

  • 35:31: Encapsulating workflows into functions: Sacha: Yeah, I have a prepare-for-screencast that does something similar, changes font size, etc, etc. Tt's so wonderful that in Emacs, you can

    Prot: Exactly.

    Sacha: just keep collapsing things into functions that do the thing that you wanted, and it has access to pretty much everything. I just need to remember to actually call the thing and remember what the thing was actually called. Aliases are very helpful, so it's orderless, but it's like…

    Prot: Another thing that might help is long names. Because with long names, you have more chances to match it. For example, in this case, it could be called prot-streaming-mode, but you could also call it prot-streaming-and-video-demonstrations-mode. And of course it sounds ridiculous, but if you think about it, I might search for, I do M-x and I search stream. I find it. I search video. I find it, right. I search demo. I find it. So, if you care about something, you can name it that way, and then you find it more easily. Or, of course, with aliases, you do the same, right? prot-streaming-mode, alias, prot-video-mode, alias, you know how it is. But, yeah, either of those would work. Basically, benefit from the fact that you have completion, and I imagine you also have orderless.

    Sacha: So definitely that. And then

    Prot: So, yeah.

    Sacha: for the free form notes thing, it just occurred to me.

  • 37:05: Popping up notes: Sacha: So in addition to your posframe stuff in your config for quickly popping up an Emacs posframe for some commands, like, do you have some things? I suppose I could just use that directly for my notes and for the chat. Do you have any other of those "quickly pop up something so that you can do something with it and then make it disappear?"

    Prot: No, I haven't built a lot on that. So I have some functions I do

    Sacha: That's your main thing.

    Prot: with that. Specifically, I have it for the timers. For me, that's very useful. And for org-capture, but I haven't elaborated on it. Of course, I could do that more. Another that I… By the way, it's not a poframe. Technically, what I have is just a new frame. But the idea is the same, right? It pops up and it disappears. And I can share the code for that. It's in the prot-window package, actually.

    Sacha: I have it highlighted here in my…

    Prot: So it's a small macro there.

    Sacha: So this is the thing that I was telling you about earlier where it just extracts all the things that I've highlighted. It's very, very cool. It's in one of these, I'll grab it eventually. Which is good because I have to go over my config at some point.

  • 38:21: Rediscovering things in my config: Sacha: There's so much in there that I've completely forgotten writing about. And so I'm like reading this now as I'm splitting it into different modules and saying, oh yeah, I automated that. I'm doing it manually again.

    Prot: The other thing that might help is a prefix key. So I have done that with C-z. So it's a prefix key, and then either with which-key or with Embark, you know, the Embark… When Embark replaces C-h. I forget how it's called now. You can always see, OK, what do I have? Like, what are the groups? And then you can cluster things there. And it's very easy. Ever since defvar-keymap, ever since that became a thing, it's very easy to write prefix keymaps, because it has a keyword called prefix, and then with that prefix you define how the keymap should be called as a command.

    Sacha: That's interesting. I should definitely look into that. Finds how it should be called. That's a command. So you can just add it to other key maps as needed. That sounds cool.

    Prot: So consider this difference, like right now, you can take a defvar, which is a keymap, right? And you can bind it to a key, the keymap itself, without the quote, you can bind it to a key. So you will do define key in the global map, like whatever you want, and then bind it. What happens though with that is that you're binding the value of the keymap to the key, which means if you make changes to the keymap, your key doesn't know about them.

    Sacha: I've been running into that. I get annoyed and I have to keep re-evaluating my definitions. So yeah, okay, that's what I do.

    Prot: Whereas if you have the prefix, which is now a command, you have created an indirection. So now you define key to the symbol that you have specified. And that, of course, is that indirection, which now gets the up-to-date value of the keymap.

  • 40:31: Catching up on Emacs developments: Sacha: So this is Emacs stuff that I have been missing out on, because for the past 10 years I've just been squeezing things into whatever moments I can have before somebody comes and says hello and says mom mom mom mom, and now that I have a little bit more focus time, I'm looking forward to finding out about all the cool stuff that has gone into Emacs and that I'm not currently taking advantage of. So things like, for example, I only scratch the surface of using Lispy, and I want to do other things as expressions because it's all magical. And if you have similar, like, oh yeah, this is a new thing in Emacs 30 or 31 that is super helpful and not everyone knows about it, I'd love to know about it. I mean, I know it's on Emacs News, but sometimes I'm like, whoosh, it goes past my radar and I don't have the time to dig in.

    Prot: Yeah, right now I cannot think of something. But yeah, I will.

  • 41:29: diffs: Prot: Oh, a very small thing that helps me a lot when I make any kind of edit. You know, there is this function diff buffer with file. So that's good. For me, what I always want is

    Sacha: that sounds like a little tweak

    Prot: diff-buffer with a current file. I don't want to diff a buffer with some random file. So what I have is a very small extension, a very small function, which is diff-buffer-buffer-file-name. So buffer-file-name is the variable for the current buffer's file. And then I do the buffer file name. And for me, that's very useful. Whenever I make an edit or I'm not sure what happened, I do that and I already see the diff. I use that a lot.

    Sacha: that I would love to to pick up as well. There's all sorts of interesting workflow things that I am looking forward to discovering as I figure out the better way to watch videos and then also make videos, because one of the things I find is whenever you demonstrate something, sometimes, if you're really lucky, someone will say, oh yeah do you know about this thing that does the whole thing, which is great. One of my favorite reasons for sharing things is learning from other people. All right. You write this really long blog

    Prot: Same. Like you put it out there and somebody will be like, hey, you could do it this way instead.

    Sacha: post about this clever thing that you just figured out and then five minutes later, oh yeah, that's been built into Org since, you know, version 9.7.

    Prot: Exactly, exactly.

  • 43:08: Thinking about the community: Sacha: Which actually leads me to: what can we do? We've got about 20, 15 minutes left in this hour. Taking advantage of your very large context window for all things Emacs community, you know, those kinds of stuff that we are interested in, what are some of the things that we could do to make things even better? This is a very open question, of course, but yeah.

    Prot: Even better, you mean Emacs in general or Org in particular? Because Org got a very nice feature lately, Org 9.8, which is the ability to preview images for any link type. So that's very useful. Before it was like the file type. Now it's any link type. And of course, if you ever want to do something with a custom link type, there you have it.

  • 44:00: org-link-preview: Sacha: Which is good because I, in fact, have an override for a custom link type where I had done it before. So I just basically copied and pasted the image preview link so that I could have my SVGs either included in it as a whole or just preview. Anyway, so yes, I'm going to switch over to the new one. Link preview, update my code for SVGs.

    Prot: Yeah, for example, now imagine this. Imagine you have a custom link type, which is called image or something, and you just give the image a name, nothing else. And internally, this link type knows to go in a specific directory and get the image from there, maybe even have copies of the image, so it can give you a copy that matches some parameter or whatever, like some user option maybe. You could have fancy things like this. I have been thinking about it, but I haven't written anything yet.

    Sacha: I would probably like… Things like my audio waveforms could go in there very easily and things like that. I'm very curious about this idea of mixing more things into other places in Emacs. And one of the things that I've been meaning to dig into is how LECDraw does SVG interaction, because it uses mouse events to be able to drag things around and whatever. Because I think if we can get richer interactivity and more graphical elements, that could be really fun.

  • 45:31: Prioritizing things to work on: Sacha: Anyway, but yes, so I've got basically three months of focus time before the kid goes on summer vacation and wants my attention at probably the majority of the day at an irregular interval. So it'll be a lot harder for me to schedule things then. I can set aside maybe 10 hours a week to work on Emacs-y things, including possibly working on infrastructure for the upcoming EmacsConf, or tweaking Emacs News or hosting meetups or whatever. Taking advantage of you as an external perspective, are there things that would be a good idea for me to particularly focus on? Things that you've been wishing you could say, Sacha, hey, just do this thing and it'll be awesome.

    Prot: I think you already have a very good setup, actually. So I don't think there is much to be done in terms of adding things. Maybe the work here is to be removing things, and that's the more difficult part.

    Sacha: No! Delegating things. Passing things to other people, maybe. Making it possible for other people to help.

  • 46:39: Modelines: Prot: There is a very small thing which maybe is useful, maybe it isn't. I don't know how much you use the mode line, how much you rely on that, but the newer version of Emacs makes it possible to shrink the lighters for the minor modes.
  • 46:52: Modelines: Sacha: Yeah, I don't use the mode-line as much. I ended up moving keycast to the header line because it's a little bit more visible in videos. Sometimes when closed captioning is on, it obscures the mode line. So I don't tend to look at the mode line for much, and I'm wondering what I'm missing out on. And I'll probably also want to add: am I streaming?

    Prot: Yeah, not much. Not much is the answer, but maybe you could declutter it in that regard so that then it is useful. For me, where it really is useful is to know some things such as, of course, what is the buffer name? Is the view narrowed? That's, for me, really important. Maybe is it a read-only file? And am I running a keyboard macro?

    Sacha: Is my microphone on?

    Prot: Yes. Good, good. You see, there are all sorts of good ideas. And you can think of those as just one character, right? And you can have that one character with a face, which has, for example, a background. So is my microphone on? That's a green background. Am I streaming? That's a red background or whatever. And you just see the colors there and you know everything is all right.

    Sacha: Although, actually, now that we're talking about it, I'm thinking maybe I should just revive websockets. So I made an obs-websocket.el thing before, and someone has… The benefits of making a package: someone has actually updated it to work with the new WebSocket protocols. I just have to get the whole thing set up again so I can communicate with OBS. I can use a different theme, most likely another Modus theme, when I'm streaming, so that it's a little bit more in my face: okay I'm looking at the correct colors, I am public.

    Prot: That's the other thing. Yeah, that's good. That's good.

  • 48:50: Themes would be nice to have per-frame: Prot: With themes, unfortunately, that's actually something I would like to have. We cannot have them per frame, which is strange because if you do set-face-attribute, you can specify a frame argument. But if you do something like custom-set-faces, you cannot.

    Sacha: I'm sure that once you start messing around with Emacs internals, you might be able to figure out the way to do that.

    Prot: Yeah, now that I say it, it shouldn't be too difficult. Yeah. Famous last words.

    Sacha: Yeah, yeah, yeah. That's really fun. Okay, so that gives me stuff to work on.

  • 49:27: Livestreaming conversations with Prot: Sacha: I brought up briefly the idea of possibly setting up some kind of streaming things because I think, for example, this conversation that we have… I have so far managed to not share anything that is too private, except for, of course, the time when the kid is like, hello, mom, I need your attention and I want to be on stream. She likes to make cameos. So we could share this, and we could potentially think about having these kinds of conversations as something that other people could join in on, because it causes more questions, it's more interesting, and it also gets stuff out there without me having to type the lessons learned. So is that maybe something we can consider doing, I don't know, once a month for the next three months?
  • 50:11: Getting together: Prot: For me, yes. Even more frequently than once a month. Whatever works for you. For me, it works. That's the point. And also not in the context of coaching or whatever, but generally as a collaboration, I'm totally okay with that. Basically, more events for the community. I'm all for it.

    Sacha: Yeah, because it is different. I very much had missed doing Emacs chats, and I'm so delighted that you've got Prot Asks. I'm looking forward to watching the one that you just released, because it's a community event, right? You get to know about interesting things about people. And there are a lot of things that come up through conversations that don't come up when you're just writing by yourself.

    Prot: Yes, yes, yes. It's really that. It's really that. And for me, it's also another thing, which is it's more inviting. Like, it's like you are telling people, hey, show up like you can participate. Actually, we are friendly. Like, here we are. You see us. I think that kind of encouragement helps.

    Sacha: So if you want to do, like, Emacs office hours on a regular basis, either something that you schedule in yours… Is it a YouTube thing where we can both schedule a live and then both have it, or not? I think they've got a collab thing now. I don't know.

    Prot: I haven't explored it. So on the technical side, I really don't know. But in terms of intention, I'm all for it. So we can of course figure out the technicality.

    Sacha: You have the bigger channel.

    Prot: But I really don't know. We can do it twice a month, or even if you want, if you are really

    Sacha: If you want to set it up, then Thursdays are probably good. Or if you want me to set it up, then I can do that. And then we can figure out the platform details and the non-YouTube way for people to join… probably IRC. We've got all this lovely infrastructure for EmacsConf, which I dust off every month for meetups. So that's certainly something we can slide right in there too. Okay, so if we do it once a month, that just gives me three sessions of practice, but if we do it like twice a month or more, I am also okay with that. I think we can squeeze that in and make that happen.

    Prot: into it, once a week, a live stream once a week. And yeah, people can join, and we can always have a topic and talk about it and take it from there. We could also do it. Now, I don't know whatever makes more sense, but we could do it on my channel. And then, of course, with a prominent link to your channel, or we can do it one on your channel, one on my channel or always on your channel. Me, I don't mind at all. Like me, I'm in for the fun.

    Sacha: We'll figure out the technical details and whatever off-stream. It could be interesting because then that gives people a friendly place to drop by and chat. And also because I know you're there and I'm there, it gets away from the talking to myself. When it's just me talking and then it's just like chat is silent, it just feels like I have this unfairly privileged position. So yeah, that's definitely something we're going to look into. We can structure that as one of these coaching thingies if I'm looking for excuses to use the Google Open Source Peer Bonus. I still haven't really made a justifiably good plan for it. So yes. Okay. Oh, this has been very helpful. I've got like all these tips. If you're okay with it, I am totally fine with posting this recording online. If you want, you can also post it. I think there's some kind of collab thing.

    Prot: Me, I don't have a recording. So you can do whatever you want. So it's really up to you. Me, I don't mind. The reason I don't have recordings of my meetings is because I really have this policy of, you know, it's private. Your name is never known. Nobody has seen this. That's the idea. Of course, in your case, you're making it public. So, of course, that's fine.

    Sacha: Yeah, my stance is always, well, I'm going to learn stuff, but A, I'm very forgetful, so I need to be able to search it and find it again. And B, other people can pick up stuff too. I might as well expand the learning and do the learning out loud. So all that is good. And then for next time, which will probably be in two weeks, or maybe earlier if I manage to get my act together,

  • 54:44: Namespaces: Sacha: I'd like to see if I can get my stuff properly split up into different modules that have the different namespace. I really think I'm going to end up shifting to the sacha- namespace instead of all the my- stuff. I used to use the my- namespace prefix so that people could copy and paste things more easily into their code. But now I'm like, well, if I put it in sacha-, then I'm not polluting their namespace if they're loading the whole library.

    Prot: Yes, yes, exactly. Exactly, exactly. That's a good thing.

    Sacha: So that's on my to-do list.

    Prot: And with naming things, of course, I also hinted that in the article I wrote in response to your blog post. It really helps to think about the names. Also, with what we said earlier about finding things like so don't try to be too terse, too economical with the names like make the most of it.

    Sacha: I'm using nameless anyway to hide the prefixes. Got to get the hang of using the keyboard shortcuts to insert things.

  • 55:46: Verbose function names: Sacha: Yeah, so I do like having very verbose function names and just practically full sentences in the thing. All that is very good. So that's my main thing. Aand then of course, getting into more ERT… I have this function that now that lets me try to jump to the test or the file that's related to this thing. So we'll see how it goes, especially as I move things into these different functions.

    Prot: Okay, okay I'm not sure how you are doing that, but if I were to implement something like that myself, what I do with the ERT tests, it's always the prefix of the ERT file and then the name of the original function, double dash and then the name of the original function. So, for example, let's say, modus-themes-tests, right? So then it's modus-themes-tests–modus-themes-load-theme, for example.

  • 56:45: Naming conventions for ERT tests: Sacha: Okay, so that's your naming convention.

    Prot: That's a convention. That's a convention, yes.

    Sacha: I should try that. I've just been basically naming things as function-name. And then I was, like, maybe I should be calling them function-name-test. Or in this case, you know, package.

    Prot: Just to add something to this, because you also named this, so the nameless user. So there is built into Emacs this thing called shorthands.

  • 57:14: shorthands: Sacha: Yeah, I read about that, but you did mention that some people have been going back and forth about whether it's worth using it or whether it confuses things more. I think just leaving the names as is and then just displaying it differently seems to be like an in-between step.

    Prot: So that's what shorthand does. The name is, for example, modus-themes-test. And shorthand, effectively, is a buffer local variable which takes the small prefix and maps it to the larger prefix. So modus-themes-test can be mtt, for example.

    Sacha: Okay. All right. So basically it's a more powerful nameless, more configurable, and it's built in. So I should check that out also.

    Prot: Yeah, you can check it. It's not configurable, like it doesn't give you too many options. But the point is that for this simple case, at least for the tests, I find it useful because I don't want to have like a railroad of a function name, right? So I just want to be looking at something that I can understand. And basically, the prefix of the test is just there for it to have a prefix. And then I know what the function I am testing is.

  • 58:27: Bisecting config in multiple files: Sacha: I had a quick question about the config. So you have, in addition to your modules, you also have… Your Emacs's configuration is also split up into multiple files. How do you bisect these things when you're tracking down the bug?
  • 58:46: "I don't write bugs.": Prot: I don't write bugs. No, no, no, of course, I'm kidding.

    Sacha: That's going to go in the quotes. Okay, I don't write bugs. I write a lot of bugs. That's going to go to the blog post. It's going to be very large. So you never have to use bug-hunter because you just don't write bugs in the first place. Bravo. Good for you.

    Prot: Why didn't people think about that? Now, of course, I'm kidding. So the way it works is that they are actually standalone packages. So there is a distinction, actually, in my configuration. So there are the modules, which is the configuration blocks, what would be done with. And then there are the libraries, which are actually packages, like I could just publish them right now. For example, for the mode line, there is prot-mode-line. That could be a package tomorrow, no problem. So if there is a bug there, I will go and deal with it the way I would deal with any package, like edebug, toggle-debug-on-error, whatever it is that I am doing. So there never is a scenario where the code is in all sorts of places, scattered across the file, and then, of course, it's very difficult to track it.

    Sacha: But for your config, if it's in multiple files and you need to bisect it… Bisecting can get you to this load-file over here, this require over here is where things break down, but then you have to… okay, I want to load everything above that point and then bisect into the thing, which is slightly more annoying.

    Prot: In practice, it's not difficult, because the way I

    Sacha: I don't know. How does that work?

    Prot: load my packages, so in the modules themselves. So I have this macro, which has a condition case in it. Of course, usePackage has the same, but with usePackage, you have to have everything as a package, whereas what I have here is even if it's not a package. So condition case, and basically if there is an error, it tells me where the error is, and then I can find it very easily. I have never had a scenario (of course I was joking, but actually I'm serious)… I've never had a scenario where I was confused as to what was happening. It was always very easy to find the error. If it's a bug… Yeah.

    Sacha: Errors are fairly straightforward because it complains about it, but when it runs but it just produces the wrong behavior eventually, then that's the annoying part that I've been using bug hunter for.

    Prot: The only scenario I think now that I had an issue like that was with the mode line, actually. Because with the mode line, if you give it like a wrong face or something, I don't remember, it will print like several messages for everything that changes on the mode line. So you will get like, well, invalid face, and there will be like, in square brackets, 100 times of this message. So That's the sort of thing that indeed is more tricky, but that was not because of my code. It was because of one small tweak that affects the mode line, and then it was about figuring out what the error is there, what's the bug there. But if you have the configuration split up in ways that are logical or thematic, if you want, whatever bug is always in one spot. It won't cut between files. So for example i have a module which is theme in the wider set but the theme also includes fonts. because fonts are, in Emacs terms, part of faces, themes deal with faces, that sort of thing. So whenever it's something related to appearance, I know that it's in the theme. It cannot be somewhere else because of how I have written it. Of course, depending on how you split things up, you will end up in a scenario where you have bugs that go across files. For example, a common one is where people will have, for example, evil mode, right? And then they will load everything, and then they will have a separate configuration module, which is for key bindings. And basically, that's a disaster, because whenever there is some problem, you don't know which key binding relates to which package, and you are always in a state that it's hard to predict. And basically, you have to do every key binding with eval after load, this package, this key binding kind of thing.

    Sacha: Oh, that's going to be fun. I do have a bunch of key bindings in my file, so I'll just have to see how that all gets organized.

    Prot: If you have them, organize them by package. Define them close to the context. Okay.

    Sacha: That's actually mostly what I've been doing, mostly because I think of it, I think of the key binding when I'm adding the package to my config, so it's right there. I just realized I could probably just copy the top of my config file with requires or whatever to a setup file, which bug-hunter can then load. So I can still probably use

    Prot: Okay, good.

    Sacha: bug-hunter with that. Anyway, thank you so much.

    Prot: Yeah, sure. I just wanted to ask the last thing. What is the kind of bug that you have encountered? What kind of bugs are we talking about here?

    Sacha: Recently, in my shifting of everything to the new system, I also happened to realize that I had updated my Emacs and then stuff wasn't highlighting in the mini buffer. I eventually found out that it was because I needed to upgrade certain packages. But in the meantime, I was like, what do you mean? Okay, emacs -Q, sometimes it's working, sometimes it's not working. Okay, let's start narrowing it down. And that was fun. The other thing that I recently had to bisect was: I was exporting my really large config after having split things up into different modules. One of the lines was causing it to go into like a debugging thing, but it would not tell me what it actually debugged. You know, the backtrace would just not happen. So then I actually had to narrow to region and then export the specific sections of my file until I narrowed it down to, okay, my defvar custom link needs fixing. So I do this kind of bisection a lot. Ideally, whenever I can, I like to be able to just write an assertion so that Emacs can do the work of narrowing down when this happens but sometimes it's just, you know, you gotta pick your range and then execute the thing and see what happens. So I'm always looking for tools because I write a lot of bugs. I'm sure by the time I see you again, it may be either next week or next next week, I will have more bugs to share and more things to learn from. But this is very helpful and I am looking forward to updating you once I get all of the stuff checked off my to-do list.

    Prot: Very good. Let me know how it goes.

    Sacha: Yeah, yeah, awesome. Thank you so much.

    Prot: And for the live streams, we see how it goes. Yeah. You will tell me. Yeah.

    Sacha: And it's okay to post this recording if you want to?

    Prot: Whatever you want. Whatever you want.

    Sacha: Awesome, all right, see you around.

    Prot: Take care, Sacha. Bye bye.

Ideas for next steps

Oh, do I ever have a lot of ideas to follow up on. =) But I'm making myself get used to writing them down so that I can post these notes instead of trying to squeeze in just one more tweak… Anyway, plenty to explore!

  • Add chapters to video
  • Edit transcript - rough
  • combine multiple captions
  • Post the video
  • Post notes (this one!)
  • Schedule next session and open it up
  • Try Internet Archive
  • Combine transcripts and use speaker tags; style the output
  • [-] Redact part of the video
    • Write about compile-media updates
    • Get my GPU working for ffmpeg
    • Get my GPU working for whisperx
    • Select the coordinates from Emacs
  • Streaming and video
    • Write about two-speaker workflow
    • Make sure vtime link type works with this player
    • Figure out a workflow for adding intros or wrap-ups - cancelled, not needed for livestream
    • Display YouTube chat in Emacs
    • Find a way to send text to the YouTube chat
    • Extract part of a video as a clip
    • [-] Make a global minor mode for doing things publicly (Mode for streaming)
      • Change theme
      • Turn on line numbers
      • Turn on keycast
      • Change agenda files and inbox
      • Save narration
      • Consider consult previews, marginalia
    • Make a todo link type that creates the TODO item and publishes a link to it when finished
    • Make public-ish Org files
    • Send a URL to the stream as QR and text chat
    • Send text to the stream
    • Calculate timestamp offsets into a recording
    • Quickly log times and notes to current task and stream log
    • Make a nicer combined transcript PDF for review
  • [-] Reorganize my configuration
    • Finish extracting the rest of my functions
    • Rename my- to sacha-
    • Write about my org-babel-post-tangle-hook
    • Try out substitute, especially with the replace-regexp-as-diff idea
    • Define function aliases - cancelled, didn't need them
    • Try shorthands
    • Try defvar-keymap :prefix
    • Practise using docstrings to declare intent
    • Convert my custom link preview code
    • Replace C-z
  • Testing
    • Set up a Makefile snippet for tests
    • Settle into a naming convention for tests
    • Practise mocking up functions in order to test things that are more interactive
    • Make code coverage more habitual
  • Finish reading Prot's config and process my notes
  • Set up crdt just in case
  • Play with the idea of XP (experience points) as a reward for postponing a task and then picking it up again
  • Write about deleting windows vertically; consider beframe and shortcuts to arrange frames
  • Pop up and dismiss my notes
  • Make my notes contextual

Want to join us on Thu April 16 10:30 AM America/Toronto, 5:30 PM Europe/Athens? Check out the livestream we've penciled in for April 16 - come join us!

View Org source for this post