Categories: geek » emacs

View topic page - RSS - Atom - Subscribe via email
Recommended links:

2026-06-15 Emacs news

| emacs, emacs-news

Lots of discussion around Karthik's latest blog post Even More Batteries Included with Emacs (Reddit, HN, lobste.rs). Check it out!

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

View Org source for this post

From DC Toedt: Copy Org Mode as Markdown

Posted: - Modified: | emacs, org

: Add embark way to do things.

DC Toedt is a lawyer and professor of practice who uses Emacs and Org Mode. He wanted a small Emacs Lisp function to convert Org Mode syntax to Markdown and copy it to the clipboard to make it easier to copy the materials he's writing for a course on contract drafting. This seems to be a common need, and here are several other approaches:

Anyway, DC shared how he used Claude to generate a simple function to do it, which is here under public domain:

(defun my/org-to-markdown-clipboard ()
  "Export org region (or buffer) to Markdown and copy to clipboard.
With no active region, exports the whole buffer."
  (interactive)
  (require 'ox-md)
  (let* ((text (if (use-region-p)
                   (buffer-substring-no-properties (region-beginning)
(region-end))
                 (buffer-substring-no-properties (point-min) (point-max))))
         (md (org-export-string-as text 'md t '(:with-toc nil
                                                :with-author nil
                                                :with-date nil
                                                :with-title nil))))
    (kill-new md)
    (message "Markdown copied (%d chars)" (length md))))
(with-eval-after-load 'org
  (define-key org-mode-map (kbd "C-c m") #'my/org-to-markdown-clipboard))
View Org source for this post

Yay Emacs 33: Sacha and Prot Talk Emacs: Built-ins

Posted: - Modified: | emacs, yay-emacs

: Updated transcript

I chatted with Prot about the Emacs Carnival June 2026 topic Underappreciated Emacs Built-ins. Thanks to Ross A. Baker for hosting the carnival!

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

Related links:

Chapters

  • 0:00 Starting up
  • 2:27 Focus and distraction
  • 3:54 Org Mode and other note-taking, task-management systems
  • 4:58 Kill ring
  • 6:50 Registers
  • 9:58 Narrowing
  • 12:04 org-narrow-to-subtree
  • 12:13 narrow-to-defun
  • 13:19 Indirect buffers
  • 14:50 Undoing within a region
  • 15:53 Bookmarks
  • 17:41 isearch
  • 18:21 Tip: Add a counter to isearch
  • 19:26 C-x C-x (exchange-point-and-mark)
  • 20:55 Popping to marks - going back to where you were
  • 21:49 Selecting what you just pasted
  • 22:33 Indenting pasted or selected text with indent-rigidly
  • 23:24 Popping to mark after xref or imenu
  • 24:05 Adding other packages like consult
  • 24:44 Tip about indicating isearch wrapping
  • 25:26 Navigating by sentence or s-expression
  • 27:45 Navigating to other errors
  • 28:29 Tags
  • 28:47 Imenu
  • 30:19 Projects
  • 32:10 Putting projects in tabs or frames
  • 32:35 Tabs
  • 34:41 Navigating frames
  • 36:07 These navigation shortcuts work for prose, too
  • 37:09 follow-mode
  • 37:50 Ediff
  • 42:12 Calling functions by name
  • 42:52 Completion
  • 44:13 Manuals
  • 45:57 Menus
  • 47:46 Automation - abbreviations
  • 49:56 Quoting the next character with C-q
  • 50:31 Mapping abbreviations to code
  • 51:51 Taking notes with org-capture
  • 52:08 Navigating back to captures or refiles
  • 53:49 dabbrev
  • 54:44 Keyboard macros
  • 57:52 Editable grep and occur
  • 1:01:01 Emacs Carnival June 2026: Underappreciated built-ins

Transcript

Expand this to read the transcript

0:00 Starting up

Sacha: There's a 10-second delay, so I can never quite tell when I'm starting to start, but I think I'm going to do that now. Okay, let's go. Okay, I have pressed the Go Live button. Let's see how it goes. So this is Yay Emacs 33 with Prot: Sacha and Prot Talk Emacs. Today, we're going to be talking about underappreciated Emacs built-ins, which is the theme for this month's Emacs carnival.

Sacha: Kind of like this, you know, shared, lots of people writing or talking about a specific topic. This one is hosted by Ross A. Baker. (Thanks for hosting that!) Anyway, so I'm here with Prot. I was very tempted to just dive into this brain dump like last time about... Let's start with the kinds of problems that newcomers and intermediate users might run into, especially the problems they don't even know about because Emacs would allow them to do things that other editors might not offer. But they've got to think about it first, right? They've got to discover that this is a need of theirs and that Emacs can help them with it. So maybe this conversation can be a high-level discussion of these concepts to help people develop this intuition for what's out there, particularly for the things that Emacs does differently compared to other editors. And if we start with a problem, and I have several that I often run into in my own life, you might suggest others as well. Then we can talk about how the things that are built into Emacs can support that and how they fit together at a high level. We don't have to go into "This is precisely how to start a keyboard macro and how to stop it." People can look that up in the manual. But the idea of a keyboard macro and how it's useful, that would probably be a good thing for a conversation. Then for the advanced users who are listening to this, we can sprinkle in some things we've seen about some really advanced uses of these built-ins, because there's a lot of high-level use that I haven't even got into yet. So Prot is here, which means that because you've got two people, you can see how these same tools can be used in different ways to support different workflows. I'm going to suggest some problems that I have. Of course, you can share some from your experience and from the times that you've coached other people.

2:27 Focus and distraction

Sacha: My main problem with life in general. is focus and distraction. Because I have a kid, my focus time is very unpredictable. It can be interrupted any moment by somebody needing help. My life over the last 10 years has mostly been about five minutes here, 10 minutes there, maybe 15, one hour of focus time if I'm lucky. This is a universal challenge. Well, some people actually get to focus, but my brain is not one of those focusable things. It has to work in stops and starts. Any chance this is a problem that you also run into?

Prot: Not to that extent, but I have the propensity to go down rabbit holes. I will go really deep, like really deep. You give me something which I know nothing about, I will become an expert in it. But of course, this is a problem when you combine it with curiosity, because now you want to learn everything. Thankfully, I have learned to control myself. If you give me something I don't know about, I will say, OK, sounds very tempting, but I will not even try. I won't even go down the rabbit hole.

Sacha: So these are two sides of the same problem, and something that a lot of people will resonate with... When you're working on something and you realize, okay, I've got to go do this other thing first or, oh, I'm curious about this question that has come up in my brain. I want to go down that rabbit hole. How do we manage this? Emacs is here to help.

3:54 Org Mode and other note-taking, task-management systems

Sacha: My first recommendation for this problem is: take advantage of Org Mode or other built-in note-taking task management support systems because it... Sometimes people think, okay, an IDE is just an IDE, right? If they're programmers, it's just for code. Sometimes people are writing. They're using a text editor just for writing their novel. But because Emacs has these built-in ways to support managing your to-dos and all that stuff, it's very easy just to stuff that task in there. Have a quick shortcut to go to your to-do list and put something in. Then it gets out of your brain so that you can try to focus on the thing that you're trying to get done. That's my quick underappreciated... actually, a lot of people really appreciate this, but it's one of those things people coming to Emacs from other editors might not immediately catch on to.

Prot: You might not understand the extent of how valuable it is. It's the gift that keeps giving, basically.

Sacha: Yeah, yeah. When your to-dos and your notes are just a couple of keystrokes away, and they can save the context of whatever you were looking at.

4:58 Kill ring

Sacha: There are all sorts of other small conveniences that Emacs has that also help with distraction and focus. For example, the kill ring. It's such a simple thing, right?

Prot: It's super simple, but super useful. Just to say on the kill ring, it has been part of Emacs for several versions now, but it's not obvious. If you type M-y without C-y beforehand, you get completion. So you can select something that you had in your kill-ring like a few kills ago. Clipboard navigation, which is something that you don't see right away.

Sacha: If people are coming from outside Emacs and they're like, "What is this thing that you're talking about?" People are used to having a clipboard, right? As soon as you copy something, your program forgets the thing that you previously copied. On mobile phones now, if you press paste, you can see a selection of the previous things you've copied before. It's like that, but larger.

Sacha: Prot points out: you can use completion with it. So M-y is yank-pop I think? What I find useful about this is sometimes I'll copy something because I want to go paste it somewhere else, and then on the way to that somewhere else, I get distracted by something, and I need to copy that, but I know that the kill-ring will have the other copies that I meant to put somewhere else.

Prot: By completion here, we mean you can type and match that thing, narrow down to it.

Prot: You don't have to go searching for it and, "Okay, which one exactly is it," right?

Prot: You can find it more easily.

6:50 Registers

Sacha: Registers. It's the other thing that I like to use when I know that I'm copying several things and I need to paste them, possibly in different order.

Sacha: Again, that's another thing that people are like, "What is this thing, even?" Do you find yourself explaining registers to people who are new to Emacs?

Prot: Yes. Registers is something that is underutilized, because of course, why would you need them when you can have a kill-ring with a history, right? Why do I need to store things in a register when I can just have them one after the other in the kill-ring. The answer is because if you do something more advanced, such as with a keyboard macro, it will always be correct. It's precise. It's not "Give me the last thing on the kill ring," or last thing minus two or whatever. Give me that, right, and you specify what that is. It's an expression of intent.

Prot: Plus more advanced things, like incrementing a number or whatever. I think that's super specialized.

Sacha: I don't even use that very much, but I know some people who use that to great effect. So that's one of those little Easter eggs for advanced users. If you're watching this and you're like, okay, I know about these built-ins, but there's more. Emacs has this fractal complexity. It just keeps getting more interesting the more you dig into it. Okay, so, registers. Registers can store text that you're copying, but they can also store other things. I think, like, do you use them for window configurations, Prot?

Prot: I have used them for framesets: frames and their window configurations. If you have three frames and they are split in different ways, you restore that.

Sacha: You can do all of that with just one register.

Prot: With a register, yeah. I have created another register of mine just to see how it works, where it saves a file with a specific location, but it's supposed to be in memory, not like a bookmark. I did it just for testing.

Sacha: I have that too. I use registers to files so that I can jump to things like my Emacs configuration or my notes or something like that. I use that instead of bookmarks so that I can just have a keyboard shortcut go straight to that register. I can do the [jump-to-register] and then I can just easily press one more key to get to the file that I want. So registers, again, if you're not used to Emacs, this is a built-in that's got a lot of features for helping you save text to things, especially if you're going to use them in keyboard macros because you can say, okay, insert text A and then insert text C and then insert text B. But you can also use them for other things like frameset, like the way that your windows and your buffers are arranged, or files that you want to go back to.

9:58 Narrowing

Sacha: Another built-in that I find really helpful for managing my focus and distraction is narrowing. I get distracted by all the other stuff, or I worry about accidentally revealing private information when I am streaming, or something else. So instead I narrow it to just the task that I'm working on or just the function that I'm editing. That's super useful not only for keeping me focused, but also for making sure that my changes don't affect more text than I mean to. If I'm using substitute.el... You can select the region, and a lot of the functions in Emacs will operate only within that region. But reselecting the region several times, if you end up needing to do multiple operations, it's a bit annoying. So instead, I'll just narrow and then it can work on the whole thing.

Prot: Yes. When you narrow, you can also be less careful, in a sense. Like, you do a query-replace, when you do !, it means yes to all, but if you are in a narrowed region, yes to all means only within that portion of the buffer. So if you take care to narrow to where you want to be, then okay yes to all, you don't even have to check.

Sacha: And I think this is underappreciated enough that, in fact, if you try to use… Is it C-x n?

Prot: That's the prefix key. C-x n for narrowing.

Sacha: The first time Emacs will say, are you really, really sure? It's one of those disabled commands, right? You've got to enable it for yourself. You've got to say, "Okay, I know what I'm doing. I'm not going to panic if the rest of my file disappears." I know it's there. I'm just choosing to focus on it. I think it's actually available off the menu as well, but I haven't used it off the menu bar.

Prot: Yeah, I don't use the menu, so I cannot tell. But I remember that prompt, "Are you really sure?" It's disabled by default. Please make sure you know what you want.

Sacha: Keyboard shortcut. That's the way to do it anyway.

Prot: The thing is that I do use it extensively.

12:04 org-narrow-to-subtree

Prot: Narrowing, of course, is generic., Org also has its own narrowing. The most common one is [org-narrow-to-subtree].

12:13 narrow-to-defun

Sacha: Narrowing to defun feels easier than trying to mark the function before search and replace. I love narrowing. In fact, I narrow to functions or sets of functions a lot, because I do a lot of work with with Javascript in HTML files, just a single file HTML that I can upload. It's got CSS and regular HTML in it as well. But I often just need to copy the particular snippet of JavaScript so I can paste it into the console as I'm making changes. I have a function that looks for certain text: "start of focus", "end of focus". Then it narrows to that section, which might include several functions. Then I have another keyboard shortcut that just copies the entire buffer and adds a little text at the end, so I can run whatever function I need to test. I can paste that into the browser. Narrowing either to one function or to a predefined region or whatever else is very useful.

Prot: Yes, very nice.

13:19 Indirect buffers

Sacha: Then people are like, yeah, but what if I want to narrow to two parts of the same file?

Prot: That's why you have indirect buffers there.

Sacha: It's Emacs, of course there's a way to do it. Indirect buffers is another one of those built-ins that's a little hard to wrap your head around, because you're like, okay, you're opening a file twice, but you can have it narrowed to a different part of it, or you can be looking at a different part of it, or you can even have it in a different major mode.

Prot: Yeah, yeah. And the point, like the practical one, is the different levels of narrow, really... The most common one, I mean, where it's like, okay, you focus on this heading and now you focus on this other heading.

Sacha: I'll often split my buffer if I know that I'm not going to narrow. So that way, if I need to refer to two parts of the file at the same time, I can have one window focusing on one part of it and the other window focusing on the other part of it. It might even be a different frame. And that way, I don't have to keep switching back and forth. I don't have to scroll up and down all the time. I can just look at one and then look at the other and arrange my windows and my desktop as I see fit. But if you want to do something more complicated, like more narrowing or different modes or whatever, then cloning an indirect buffer is the way to do it.

14:50 Undoing within a region

Prot: I don't know if you have this, but because you mentioned the region earlier, I will say it. Maybe you have it somewhere, I don't see it there. You know regular undo in Emacs and how it works, but when you have a region selected, undo works in the region. So you make a change here, you go make some changes up there, you come back here, you mark this region, undo only works here, it doesn't work up there anymore.

Sacha: Oh yeah, that's definitely a built-in that people will benefit from if they develop an intuition for it. If you've made a bunch of changes to your file and you notice that something's wrong in just this section, you can select the region and then undo within it to just fix those things. Those are some of the things that I've thought about for focus or distraction or getting tempted to go down rabbit holes. Do you use any of the other Emacs built-ins to help you with your tendency to dive really deep into something?

15:53 Bookmarks

Prot: So the other one would be bookmarks. You mentioned it already, but it really is worth having it there, because the nice thing with bookmarks is that not only it's a way to go to a place, but you also give it a name. So the counterpart... Like you said, okay, I have a key to quickly go to my init file, for example, my configuration file. But what if I want to have something by name that doesn't quite fit nicely in all the keys, right? Then I can have a descriptive name. Maybe it's long. For example, my notes for my meeting with Sacha, which is in mid-June, blah, blah, blah, right? I can have a long name like that, which is descriptive and gives me context. Then I use a bookmark for that.

Sacha: And that's a great built-in solution for the general problem of finding your way around. So in case you're trying to find your way around different files or different projects or different places in various files, bookmarks are great for that because you can give it a name. That means you can file more things than will fit on your keyboard. Kind of an advanced use of it, I was talking to Ben in the previous Emacs Chat about So he bookmarks Elfeed searches, and based on his naming convention, if he names his bookmark a certain way, then it becomes available for these other functions that he has. So if you have a naming convention for your bookmarks, you can do other things with it from Emacs Lisp.

Prot: Yeah, exactly. That's the more advanced power user thing. It's just data and you have access to it.

17:41 isearch

Sacha: Going back to something a little more basic for the problem of finding your way around, I think that isearch is one of those built-ins that people coming from a different editor might not think of using. "Find in page" is an annoying experience in a browser or in other editors. You have to go to the menu, you do it, and then there's things you have to click on in order to go to the next one or the previous one and so forth. But isearch lets you just keep typing and then you can just press the isearch shortcut again, C-s, to search for the next one, or you can go to the previous one very easily. So isearch is great.

18:21 Tip: Add a counter to isearch

Prot: Yeah, yeah, it is. I think one nice quality of life improvement to it, which again is several Emacs versions old, is a counter. Like it shows you are on number 3 out of 10, for example. You have a sense of where you are going.

Sacha: Otherwise, I find I just wrap around to the beginning and I take a moment to reorient myself because it has wrapped around. The other thing that I want to point out related to isearch as well is using it to help you mark a region. This is something that people aren't used to because in other editors, you highlight things with your mouse, right? Here in Emacs, we say, okay, press C-SPC to say you're going to start a region, and then just search for the end of the region, navigate to it somewhere, and the text between when you press C-SPC and where your cursor is now, that's the region.

Prot: Yes, exactly.

19:26 C-x C-x (exchange-point-and-mark)

Prot: On this note, C-x C-x. By default, it’s exchange-point-and-mark. Which, if your cursor is here and where you started is up there, it moves the cursor up there and now where you started is down at that point. You can expand the region both ways. You can keep switching and expanding.

Sacha: I have never thought about using it for expanding the region. I usually just use it to confirm that, yes, I am actually selecting the parts that I meant to select. Because by the time, of course, I've found the thing that I wanted to end the region with, I've forgotten or I'm not entirely sure I have the right start. So I was using C-x C-x to quickly verify and have everything nicely highlighted. But expanding the region, yeah, that's a thing you can do with it.

Prot: Yeah, yeah, of course. Now it's obvious, right? But it's something that you may notice by mistake, by accident.

Sacha: [interrupted by life] @charliemcmackin4859 says, "I love that you can make those marking tricks part of a keyboard macro."

20:55 Popping to marks - going back to where you were

Sacha: Oh, the other thing I want to say with marks is you can also navigate by mark. C-x SPC?

Prot: C-u C-SPC. I think it’s pop-to-mark is the concept.

Sacha: Popping to mark. We'll just go with the concept because people can search for the key binding. Which basically means for all the places where you were before you went off searching for something else or doing some other command, you can go back to those places in sequence. I think there are even some commands to let you easily navigate through all the places you've been previously. That is a thing that you can do with Emacs built-ins. It's called popping the mark. It lets you revisit places.

Prot: Yeah, yeah. Another point related to this and also related to yank that we said earlier...

21:49 Selecting what you just pasted

Prot: Imagine you have copied something and you are pasting it now in your Emacs. Then what you want to do is select it, maybe to do something with it, such as to make it all up case or whatever, right? Instead of selecting it manually, you can just do C-x C-x. Because when you paste something or when you do I search or whatever, it has the effect of updating the mark. Then you can work with that.

Sacha: Yeah, that one I use fairly often. Also, that way, you can easily see what it highlights, the part that you've just pasted, and then you can do your other replacements or uppercasing or whatever else to it.

22:33 Indenting pasted or selected text with indent-rigidly

Prot: The nice part for this is the indent-rigidly, C-x C-i by default, where you can now have a region of text including an implicit region between mark and point, and you just shift it around, literally left or right. Try it. It's very nice.

Sacha: C-x C-i. I think you can even use the arrow keys to move things, so you can just nudge it until it looks right, which is great because sometimes, when you paste things, the indentation isn't the same as all of the rest of your stuff. You might want to put it all the way into an Org list or whatever else, code block, whatever.

Prot: Okay.

Sacha: So C-x C-x, very handy even after you paste.

23:24 Popping to mark after xref or imenu

Sacha: Oh, @hmelman also points out the fact that things like xref or imenu push the last location before jumping means popping the mark is an easy way to go back from various navigation mechanisms. In general, if you have navigated away from something using some magical Emacs command that has taken you far from where you are, you can always find your way back home or back to where you were by popping the mark. I think there's even a distinction between popping the mark in your buffer versus popping your global mark. You can go to a different buffer that you were just in if you wanted to.

24:05 Adding other packages like consult

Prot: Very nice. Many of these are also augmented by packages. When you install a package, it doesn't introduce completely new functionality. It adds to existing one. For example, the consult package, which is very useful, very nice, has something to do with what we just mentioned. Like, navigating the mark in a visual way, so you get to see it.

Sacha: @hmelman points out that local and global marks are useful to navigate through. Check out all these other packages for adding extra functionality around that.

24:44 Tip about indicating isearch wrapping

Sacha: @matthewjorgensen9115 says, "thinking about isearch wrapping around search, gwhen you get to the bottom of your file, when you're isearching and there's no other matches to be found, it will by default wrap you around to the beginning of the file so you can keep searching from there." Matthew says you can either have scroll to position to know the direction (it also indicates the position in your mode line), or you can have your mode line flash to see it move from last to first. I don't have that configured. I should look into how to get that configured because it's like all these little things, right? But sometimes you don't need to make a big navigational jump. You just need to move forward by a little bit.

25:26 Navigating by sentence or s-expression

Sacha: Emacs has built-in shortcuts for navigating by expression, maybe things inside the parentheses or things inside the quotes, as well as natural language shortcuts like navigating by word or by sentence. Those are some very useful built-ins that are well worth learning the keyboard shortcuts for.

Prot: Yes, indeed. Of course, we call them S-expressions and the terminology of the commands alludes to Lisp, but they work in other programming languages as well. For example, there is the forward-sexp, but it works in other languages which don't have this Lispy syntax.

Sacha: So if you skipped over that part of the tutorial or the manual, go back and read it because it can save you some time. In a pinch, it will also help you make sure that your parentheses are matched up correctly and you go to where you expect them to go. There are other ways to make it easier to match up parentheses or braces or brackets or quotes like [ show-paren-mode ] or whatever. Sometimes I just go forward and back to see whether I end up in the right place.

Prot: A small trick here, if you are writing specifically Emacs Lisp, there is a very common mistake of adding an extra parenthesis, and it says "end of file during parsing", or one less parenthesis, what you can do with a combination of keyboard macros... You go to the beginning and you do C-M-e to go to the end of the defun, and then, in a keyboard macro, you keep doing that. Next, next, next, end, end, end, right? Until it stops, and you know where your error is.

Sacha: Oh, and I should tell people, if you give the execute-kbd-macro a negative argument, it'll run until error. So you just do that and it'll drop you where it ends. You don’t have to manually press e 500 times.

Prot: Exactly. The "run until error" happens when you are in a narrowed region as well. Error here means end of region, end of buffer.

Sacha: I should point out in the specific case where you're trying to hunt down a stray parenthesis, you should also just use check-parens, which will tell you.

Prot: Of course.

27:45 Navigating to other errors

Sacha: And for other errors not just limited to missing quotation marks or parentheses, it's well worth taking the time to set up flycheck or flymake or whatever error checking thing you want to use, because then you can navigate to the previous and next errors as easily as you would with keyboard shortcuts. If you get the hang of doing that, you can also use the same mental model to navigate through... If you're doing a keyword search with grep, then you can use the next-error, previous-error to also go to just the next match or the previous match.

Prot: That's very useful.

28:29 Tags

Sacha: I am not using tags nearly as much as I probably should for navigating symbols.

Prot: Tags, yeah, in the context of programming. Me, I haven't used that, no.

Sacha: Oh, yeah? I guess because you primarily work with Emacs Lisp, it's easy enough to find the definition from there.

28:47 Imenu

Prot: But imenu is the other one, along those lines.

Sacha: That's interesting. You don't use the menu bar, but you use imenu.

Prot: Yes, imenu is useful because, of course, it's with completion. Now, I should say here, of course, that the default imenu has this concept of going in steps, but you can flatten the list, which is more interesting for the purpose of completion. I believe what I'm saying is the case, but I don't remember anymore. But you can have a flattened list, at which point you navigate the file with completion.

Sacha: I should try that because I really like the way that Org, when you're navigating by the outline, you can also configure it to flatten the list so you don't have to complete the heading and the next setting and all that stuff. @hmelman says you don't actually need flymake for the error navigation thing. You can just use next-error and previous-error which works with compile and grep and occur and a bunch of other things that have the same convention. So yes, if you use the M-x compile command to run whatever your compilation step is, it will parse the output of many compilation systems, programs, and it will let you jump to the next error. It will also even show you the errors, I think. Anyway, so you don't need flymake. Flymake just gives you the squiggly underlines. But you can use next-error right away.

Prot: Yeah, yeah, yeah. Flymake is more narrow. Yeah, correct.

30:19 Projects

Sacha: I think projects and project-based navigation is another big chunk of Emacs built-in functionality that is useful for people who have a hard time finding their way around. You don't have to manually find each file. You can set up shortcuts so you can say, I want to go to this project. Then from within this project, I can find a file very easily.

Prot: This is indeed very powerful. The thing is you don't have to also think in terms of the structure of the project, like the tree structure of the project, because if you find the file in the project, it will flatten the structure for you, so then you use completion to find it or find the directory where something is. Of course, you can still use the tree view as well.

Sacha: This is great because for example, in Java projects, the directory structure gets very deep because they have to be their domain name and package names and all that stuff. Just have either project or projectile index all of your files for you, and then you can jump to a file by name anywhere in your structure. You can tell it also to ignore certain files, which is handy so that you don't have to go into your node-modules. That would be silly.

Prot: Yeah, that would be a nightmare.

Sacha: Do we have basically the Emacs built-ins for finding your way around well covered here, or other other recommendations that people should go check out?

Prot: These are already very useful, yeah. Most of these, if not all, are augmented by packages. So the core functionality is there, and then you can do more stuff with them.

32:10 Putting projects in tabs or frames

Prot: For example, with projects, you may want to have an arrangement where you put them in separate tabs, and then you use a package like tabspaces so that each tab has its own buffer list, or my package beframe so that you put them in separate frames. Each frame has its own buffer list, so that basically when you search for buffers, you only see those related to the project.

32:35 Tabs

Sacha: I am not using tabs nearly as much as I probably could, so that is one of my underappreciated Emacs built-ins here. I'm getting the sense that people use tabs to say, okay, this is the set of windows related to managing my mail, or this is a set of tabs related to this project. This is a set of windows related to this project, or this is a set of windows related to managing my notes about something. Is that what you use tabs for?

Prot: I seldom use them. I use them specifically only within the context of popping into a Magit interface. So I have my project that I'm working on. Let's say it's split in three windows. And then I want to leave everything intact and just go into Magit to do some Git operation. I configure display-buffer-alist so when I do Emacs Magit, magit-status or whatever, it goes in a new tab. Then I leave my work where it is. I do the git thing, then I quit those. I'm back to my layout.

Sacha: I know you're a good advocate of checking out display-buffer-alist and all the wonderful things it can do. I should definitely look into having it set up a tab because that sounds a lot nicer than trying to remember, okay, I need to save my window configuration to register and then do this thing. I have it set up actually so that I can winner-undo in order to get back to my previous configuration. But of course, if I need to flip back and forth between two different views, like Magit and my project code, then a tab would work much better for this purpose, I think.

Prot: Yes, and it scales better as well, like if you need to have three tabs or whatever.

Sacha: Or a new frame. But sometimes managing frames gets a little annoying too.

Prot: Of course, of course. There are pros and cons.

34:41 Navigating frames

Prot: Speaking of frames, one nice thing is that there is completion again to select frames. So I forget how it's called. [ select-frame ], I think, is the command. If you have lots of frames and you don't know where they are, you can use completion for that. If you want, you can also name frames. I believe it’s rename frame. [set-frame-name] I forget now the command. Basically, you can give it a specific name rather than it changing the name all the time. So you can say, OK, this is my super important note for our livestream, right? That's the frame for you. Now you can find it.

Sacha: I should look into that. I also underutilize frames because for the most part, I have a keyboard shortcut like Super 1 which jumps back to Emacs, raises my Emacs window. But it doesn't work so well if I have multiple Emacs window, like multiple Emacs frames. If I can figure out how to get mentally through that or if I switch to EXWM as my window manager, then I'm sure that managing multiple Emacs frames will be a lot easier. But at least tabs, I can probably use within that one frame in order to manage different windows.

Prot: I would say tabs is the first thing you want to check. Frames is a little bit more... You have to change your mental model a little bit.

36:07 These navigation shortcuts work for prose, too

Sacha: @hmelman has one more tip to include in this section on finding your way around. You can use these S-expression commands in prose too. Like for example, C-M-u or backwards-up-list moves you out of a quote or a parenthesis and then you can C-M-e to go to the end of it. So even if you're writing, for example, a novel, and you're saying, okay, I want to get out of this quote and go to the next sentence, you can either isearch to the start of it, or you can go up out of the quote and then go to the end of the quote. Also very handy to learn the commands for killing an S expression [ kill-sexp ], which again also works with other stuff like quotes or parentheses, because then you can copy and paste things or you can kill it. You don't have to paste it back. It's just you delete it and then you type something else in. It's fine.

Prot: Exactly, exactly. And one of those is the mark-sexp, which is very useful.

37:09 follow-mode

Sacha: Oh yeah, oh yeah. And @matthewjorgensen9115 shares: follow-mode allows the same file with multiple frames like a book. So follow mode can work with two, three or more windows. You have an ultra wide, right? So like, okay, you can have several columns following the same file and you can scroll and all of them will scroll in sync.

Prot: Yeah, yeah. It's quite nice. Quite nice.

Sacha: I forget, does follow mode work with different files?

Prot: With different files? I don't think so. Like kind of a scroll lock for all windows?

Sacha: Yeah, yeah, yeah.

Prot: I don't know. I don't think so. I haven't tried it.

Sacha: Worth looking into. [scroll-all-mode]

37:50 Ediff

Sacha: If you do find yourself needing to compare one file with another manually, then maybe like ediff?

Prot: Ediff would do that. You would have them side by side. But the thing with Ediff is that you don't get a scroll lock for both. It's only navigation through the differences. So that wouldn't be exactly that.

Sacha: For the purposes of comparing, Ediff will let you compare two files, but you can even use it to compare two buffers. However, Prot does have some recommendations in the one on the defaults that you shared before on how to make Ediff more manageable.

Prot: Yeah, I think by default it's not intuitive, because by default, when you do Ediff without any configuration, it will display its panel in a separate frame. If you have never used many frames, that's already your first problem. Like you don't even know what happened. The second problem is that the layout will be one above the other, which depending on your screen, you have like a wide screen, so it's not as easy of a layout. Then you have to figure out where the other frame with the panel is. Basically two variables where you change them and you have the panel at the bottom, the control panel and then file A here, file B there. And of course you can do it with three files as well.

Sacha: I will find it and put it in the show notes. Matthew also points out the following also works with centered-cursor-mode [(it’s a package)], which will keep the cursor position in the middle of the frame. So I can't remember whether there's also like a scroll lock or whatever.

Prot: scroll-lock-mode. Yeah, there is `scroll-lock mode.

Sacha: Or there was another Emacs built-in that someone mentioned that scrolls it one line at a time, keeping it centered, I guess, which the person found very useful because their cat was sitting on their laptop. So moral lesson is: learn about the Emacs built-in because you never know when a small mammal will be obscuring half of your screen. You can still use Emacs. Which actually is an interesting segue into this thing about discoverability because Emacs is quite unlike many other editors. It is very well documented and if you can figure out how to navigate and find that documentation and even how to make this fun for you, then you can do all sorts of interesting things with it. Okay, so self-documentation. I love telling people, okay, you can just press C-h k or describe-key to describe anything. You can C-h f any function. You can, you know, C-h v any variable. describe- whatever is great. Of course, adding C-h to the end of the keyboard shortcut that you've started but you've forgotten how to finish, especially if you've turned on which-key mode, is great for listing the actual shortcuts that start with that sequence.

Prot: And even without which-key, it will put all those shortcuts in a Help buffer, and it will show the key and the name of the command. Of course, you can click on the command to read about it.

Sacha: Someday I think it would be amazing if Emacs comes with a completion interface that's easy for people to understand and get started with, but in the meantime, if you don't already have completion set up, that is well worth taking the time to figure out.

Prot: Yeah, yeah. The built-in one has improved tremendously. I mean minibuffer.el here has improved tremendously over the various recent versions. But you still need to be aware of all the user options to configure it. So to get, for example, a single column view instead of a grid with 100 options... That requires some effort. Out of the box, if you really want something that is built into Emacs and does completion in a way that is fairly easy to understand, it would be icomplete-vertical-mode or fido or fido-vertical-mode.

42:12 Calling functions by name

Sacha: Another thing that Emacs does differently that might be good for people to learn about is that in Emacs, it is totally okay to not remember the keyboard shortcuts for everything or not use the menus for everything, because not everything will fit in the menus either. If you kind of remember the name of the function, you can use M-x and possibly completion to go run that function, which is helpful because sometimes knowing the words to call a function is a lot easier to remember than remembering the shortcut for it.

Prot: Exactly. And I would say completion...

42:52 Completion

Prot: If you have to configure one part of Emacs, it's completion. If you improve that part of it, it will help you everywhere. Like we were saying earlier about bookmarks, it helps you there. The kill-ring, it helps you there. Finding files, it helps you there. Switching to buffers and so on. Like what we are now talking about. It's always useful.

Sacha: When you set up a completion, also learn how your favorite completion system lets you put in things that look like they should match something on the list, but you actually want just the partial part or just the blank part. For example, in some systems, you press M-RET or M-p to send what you already have there instead of selecting one of the completion options. This is helpful because sometimes you'll want to name a file something that is a substring of another file and you want to be able to say, yeah, that is actually what I meant, not the completion part.

Prot: Yeah, yeah. I think that's the only rough edge with most of those, yeah. Where you have to be mindful of that or, you know, I have to select the prompt or I have to type a special key for this edge case. Yeah.

Sacha: Once you get that sorted out and you've drilled it into your fingers, it's very, very helpful to have completion sorted out.

44:13 Manuals

Sacha: Emacs also comes with extensive manuals. You like to write very thorough manuals for your packages, which I also appreciate. Flipping through manuals for fun is something that we've discussed in previous... This is such a great practice. You learn something new every day. I was going through the Emacs manual in preparation for this conversation and I was just highlighting things that I need to dig into.

Prot: It's very useful and again to point out completion. C-h R is how you can search for the manual of a package. Like for example, I'm interested in Org. C-h R, Org. I find Org from anywhere, right? C-h R and then I will search for something else, right? Elisp, for example, to go to the Emacs Lisp reference manual. Again, very useful. From inside the manuals, g to go to a chapter, also known as a node, i to go to a topic, an index, and m if you want, but g and i. Just think of g and i. Very, very useful. m is also useful to navigate the menu of the current node.

Sacha: I use s also for search.

Prot: And there's for research throughout, yes.

Sacha: Yes. I have not been using C-h R. I have been using C-h i to look at the whole list of info manuals and then using m or isearch like a newbie.

Prot: That works. The problem with that is that if you have already gone into a manual, C-h i will take you back to that manual. So you have to click it and then start again.

Sacha: Okay. Alright. Well, I'm learning new things.

Prot: Nice.

45:57 Menus

Sacha: Okay, you mentioned you are not a fan of... you don't use the menus and I know a lot of people...

Prot: But I appreciate that. And in one of my... oh, in a couple of my packages I have menu entry.

Sacha: Yeah, and I know a lot of people turn the menu bar off in their "this is how you configure Emacs" sort of tutorials. But if you are new to Emacs, and even if you're an intermediate user, I strongly recommend, sacrificing that tiny sliver of vertical space for the menu bar, because it's a great way to discover commands that are related to your particular major mode or other things. It's just fun to go through it and see what's been deemed worthy of including in one of those menus. There are some efforts now to get the right-click mouse menus to also have lots of interesting options, but definitely the menu bar at the top, which can also be accessed if you use F10 if you don't want to use the mouse. The menu bar is even working on terminal, which is nice. So yes, menu bar at the top has a lot of useful suggestions for discovering things.

Prot: Yes, yes, excellent. The part you mentioned about key navigation, that's also good. You may be like, don't want to use the mouse. There you have it. You don't have...

Sacha: And speaking of key navigation, if you press C-h k, which is describe-key, it will work on menu items as well. If you're finding yourself always going to the menu to do this thing, sometimes the menu items are not named the same as their commands, but you can use C-h k to find out what that function is and what keyboard shortcuts it's bound to. Then you can call it with M-x directly, or you can memorize the keyboard shortcuts.

47:46 Automation - abbreviations

Sacha: Okay, shall we move on to automation, for which Emacs has a ton of built-in things? Using abbreviations and things like that is actually something I picked up from reading your config, I think, because you use abbreviations a lot.

Prot: Yeah. Very nice. Very useful. Even for basic things. For example, I want to write, you know, my fancy French expressions, like, this is so déjà vu, you know? I want to have the accents correct. I just write deja vu with English, and then I have the French equivalent with all the fancy accents. Stuff like that you can do, like... something you keep misspelling the whole time you actually do it, right, something that is with an annoying spelling, like annoying capitalization like LaTeX. Nobody knows how that is written. You just write it latex, all lowercase, and then expand to whatever it should expand. This sort of thing is very useful. Of course, you can just have some short text which expands into very long text.

Sacha: We should also point out if you type something that is normally an abbreviation like LaTeX, but in this case you actually want to write the word latex, then how do you do the abbreviation without it being expanded into whatever that is?

Prot: Of course you would rather avoid that situation with your abbreviation. It wouldn't be like that, but otherwise you will have to undo. When you do SPC and it expands, you undo. That is a little bit annoying, for sure. But I would say, just make sure to have abbreviations that are not ordinary words. They are a little bit contrived, so you don't get false positives. A good use case here, like what I have in my configuration, like you can have your abbreviations behind a character such as the semicolon. Then of course it's very unlikely that you will have semicolon later.

49:56 Quoting the next character with C-q

Sacha: The other thing that you could potentially do is use C-q to quote the next character literally. So here for example, I have ot expand to the current time, but if I say ot C-q SPC, this helps. And in general, this idea of C-q to quote the next character is also useful in other places where you might, for example, need to add a literal new line to a search or something like that, or a literal tab.

50:31 Mapping abbreviations to code

Sacha: The other thing that I want to add to abbreviations here is your abbreviations are not limited to just text. You can use them to run things, which means you can use them to run things that expand to text, or I think you might even get away with using them to run commands. So it's pretty limitless.

Prot: Yeah, yeah. Of course, it's how determined you are to write custom code for that.

Sacha: Or how resourceful you are in finding other people's custom code that you can copy, at least. Good motivation to learn Emacs Lisp. I do not remember if Yasnippet is built-in. It feels like it's built-in.

Prot: No, but it's one of those that basically everybody uses. Yasnippet or Tempel.

Sacha: A couple of questions from chat. When highlighting parts of the manual, how are you doing this? In bookmarks, bookmark-region, using Org Remark, other ways? I was doing this at the playground the other day, so I just had it in my iPad and I had it in one of those graphical note-taking things and I was highlighting with the Pencil. But I've heard good things about Org Remark, which is a package.

51:51 Taking notes with org-capture

Sacha: You can also use just org-capture if you’re reading the manuals from within Emacs, which you can. If you org-capture, you can even select sections of the manual and it'll automatically save that in the capture template along with a link back to where you were looking. This is great.

52:08 Navigating back to captures or refiles

Prot: Since you mentioned org-capture and we talked about bookmarks earlier, when you do org-capture or org-refile, it stores a bookmark. You can go back to the last capture, the last refile.

Sacha: Yeah, yeah, which is handy. Also, you can use org-refile to navigate your Org files. In addition to using it to jump to the last thing that you filed because you were like, "Oh, yeah, wait, I forgot. I want to add more to that note," you can also use it to jump to any of your projects, for example, or any of your notes, assuming you’ve set up your org-refile-targets appropriately. Okay, @RandCode has question. Does Emacs have a grammar checker like Harper's LSP? I know there are packages that people can use to work with Harper and other things. Do you know of any other built-in things?

Prot: Built-in, it's flyspell, but that's not grammar. That's spelling.

Sacha: Okay, all right.

Prot: I cannot think of something. No, I don't think there is for grammar. So Harper or anything like that would plug into Flymake.

Sacha: @greggr0th has a question. What are your favorite completion plugins?

Prot: Yeah, I think it's really vertico. I prefer it over the built-in options, over icomplete. So it's vertico, and then with that, I would say, at minimum, orderless. So vertico and orderless, at minimum. But then, of course, if you want a little bit more, which is very useful, Marginalia, Consult, Embark, maybe I'm forgetting something, save-hist, it's built-in. But yeah, those, those for sure.

53:49 dabbrev

Sacha: @hmelman says dabbrev for dynamic abbreviations is underrated. You don't need to predefine them. You just type the start of a word or symbol and type M-/, and it will search the buffer for something starting with what's on the left side of your point and then expand it. I can't remember if it's dabbrev or hippie-expand, but you can also set it up so that it can try words from other buffers or other things that you've got or contacts or whatever. Anyway, so dynamic abbreviations. If you search for dabbrev and if you look also for hippie-expand, you will find lots of things that you can configure to fit your particular workflow. So you can expand abbreviations without having to define them.

Prot: Yeah, yeah, yeah. Super powerful. Super useful. I use it more than tab completion, you know, like with core. I use dabbrev more. It's very nice. Yeah.

54:44 Keyboard macros

Sacha: Okay, so we've mentioned keyboard macros very briefly, but this is another very powerful chunk of things that people might not be used to if they're coming from an editor that is not Emacs. So keyboard macros, what's kind of like the thing that we can use to explain? How do we explain it to people who are new to this?

Prot: In its simplest form, you record what you type and you can play it back in its simplest form. But the thing with Emacs is that you don't just record typing motions, typing actions. You also record all the Emacs motions. You can have a keyboard macro that includes stuff such as move to another window or create a new split or whatever. You can do more advanced things like that. This has very nice qualities to it where it's like, oh, I just want to copy all these symbols and move them to my shell buffer and then I will do something with them, pipe it to something like a program outside of Emacs. So it has a lot of nice applications like that.

Sacha: I think that if people can get the hang of: very carefully set up their keyboard macro, think what's a series of steps that I can do so that I can do the change and then move my cursor to the start of where the next change should be... For example, I'll start the keyboard macro, I'll delete the word, I'll type in something new, or maybe I'll paste in a register I'll use isearch to find the next point at which I need to do something. If you define your keyboard macros like this, then you're giving yourself the ability to interactively confirm whether you're still on the right track and then make the change because that way, it's not just like a search and replace and you're hoping it all works out. Although the recent search and replaces are great because they show you the changes. But for something that's more complex, especially if you're not used to regular expressions, keyboard macros can help you interactively do it in small steps.

Prot: Yeah, exactly. Of course, search and replace will be more tricky if you have to go through many files and perform multiple edits in each, because then the concept of regular expressions breaks down. You don't want to think in those terms where it's like, I will have to make a change somewhere towards the top and then somewhere in the middle and then somewhere towards the end. Keyboard macros combined with Dired combined with going to file... Very nice. Just to say another thing about keyboard macros is... Let's say you have written your very nice keyboard macro. You're recording it, and somewhere towards the end, you make a small mistake. Keep going and then C-x C-k C-e to edit your macro. It's a text buffer. You just remove what you don't want.

Sacha: You can save these keyboard macros as well. You can use them in a future Emacs session or even turn them into your first Emacs Lisp function. You can give it a name and you can run it that way.

57:52 Editable grep and occur

Sacha: In the next three minutes before the kiddo runs out for lunch break, I also want to mention, since we talked about making changes in multiple files, that grep and occur are both editable. You can do your grep and you can search for things. And then you can say C-x C-q which turns it from read-only to something you can change, then you can do your search and replace in that, and you can C-x C-q again and those changes can get put back into all those different files.

Prot: It's amazing. On this note, specifically for grep, if you edit many files with the grep edit mode that is built into Emacs 31, it will not save them for you. So C-x s, instead of C-x C-s, allows you to save multiple buffers. And every time, it gives you a prompt and you can type d to see the diff. Like, okay, what exactly did I change? If you have many unsaved files, d to see what you're about to save so you never make any mistakes.

Sacha: Mm-hmm. Taking advantage of these diffing tools is great also. Even if you're new to Emacs or you don't have a programming background, if you find yourself making changes to lots of files, I strongly recommend learning more about version control systems like Git and then using something like Magit or even the built-in VC. If you use VC, you can use it and you have set up something like a git repository. You can use `C-x v =` to diff to see the changes between your file and the previous thing that you had saved. Which makes sense so that you can see, okay, these are the changes. Also it means that you can experiment with different changes. You can experiment with different ways of writing a paragraph or whatever, and you know that all of your previous versions are saved and you don't have "really, really final version two." You don't clutter your directory with a lot of copies of the same file.

Prot: But even if you don't have any of the version control system set up, a very simple thing is diff-buffer-with-file. So you have a file you are working on and now you make some edits. The buffer, what is in memory, is different than what is on disk. You can compare the difference between the two.

Sacha: Okay, I'm going to try to wrap up here because the kid is going to run and say hi very soon. Thank you so much for joining me. Of course, there's a lot more to talk about the Emacs built-ins, but I hope we've given a quick tour of some of the things that are definitely worth learning more about and the situations for which they are absurdly useful. Thanks to everyone in chat also for coming and hanging out. I will post the show notes eventually and get the transcripts sorted out. Thanks.

Prot: You're welcome. You're welcome. Take care. Of course, good luck with everything. Didn't she show up here?

Sacha: If she shows up, she will. It's inevitable.

1:01:01 Emacs Carnival June 2026: Underappreciated built-ins

Sacha: Also, if folks are interested, even if you've never blogged before, the Emacs carnival theme for June 2026 is "Underappreciated Emacs built-ins," which is why we had this conversation. Feel free to write about something and either send [Ross and] me a link, or you can even send me the post and I'll post it on my blog with your name on it and other things like that so you can share your appreciation for these built-ins. All right. Okay, I hear movement. I gotta go. All right.

Prot: Take care, Sacha. Take care, folks. Goodbye.

Chat

  • protesilaos: ​Looking forward to this! Talk to you soon.
  • gr1maldi: ​​Yo, and stuff.🙂
  • charliemcmackin4859: ​​I just checked, there are 11 items in my kill-ring at the moment. Some of them are several lines long
  • charliemcmackin4859: ​narrowing to defun feels easier than trying to mark the function before search-and-replacing… I love narrowing
  • charliemcmackin4859: ​…and I love that you can make those marking tricks part of a keyboard macro
  • hmelman: ​​both local and global marks are useful to navigate through
  • pratikmishra4073: ​​just tried indirect buffer. didn't know it existed
  • hmelman: ​and the fact that things like xref or imenu push the last location before jumping, means popping the mark is an easy way to go back from various navigation mechanisms
  • matthewjorgensen9115: ​​thinking about isearrch wrap around search losing your place. either have scrroll to posisiotn to know the direction and how far it was away, or have mode line flash to say it moved from last to first
  • hmelman: ​Don't need flymake for that just M-g M-n (next-error) which works with compile, grep, occur (I think).
  • hmelman: ​One I keep forgetting about, you mentioned using sexp commands in other languages, works in prose too. C-M-u (backwards-up-list) moves you out of a "quote" or (paren) and then C-M-e to the end of it.
  • matthewjorgensen9115: ​​follow mode alllows the smae file with multiple frames, like a book. follow mode can work with 2 3 or more windows
  • matthewjorgensen9115: ​also works with centered cursor mode which will keep the cusor possion in the middle of the frame
  • RandCode: ​​Damn I am late, hello everyone! 🙂
  • matthewjorgensen9115: ​when highlighting parts of the manual how are you doing this? in bookmarks, bookmark region, using org-remark? other ways?
  • RandCode: ​​Does emacs have a grammar checker like harper's lsp?
  • greggr0th: ​​What are your favorite completion plugins?
  • RandCode: ​​Also, looking fresh Prot ;)
  • protesilaos: ​​Thanks!
  • hmelman: ​dabbrev is underrated. You don't need to pre-define them, just type the start of a word/symbol and type M-/ and it will search the buffer for something starting with what's left of point and expand it
  • RandCode: ​There is so much to learn that I feel like I have been missing out on all of emacs somehow lol
  • RandCode: ​Since you mentioned built-in completion framewworks, how does the built-in (vertical) completions compare to corfu btw?
  • charliemcmackin4859: ​not grammar, but if you have a dictionary server running (like dicod on linux) emacs can be made to communicate with it to give definitions at point
  • RandCode: ​Ohh, that is a cool! ^
  • matthewjorgensen9115: ​​virtico multiform mode allows custom settings command, for example for files I use grid and alphabetical, but vertico recommendations normally. This allows more value of completion knowledge
  • RandCode: ​Thank you so mcuh for this wonderful stream everyone!!!
View Org source for this post

2026-06-08 Emacs news

| emacs, emacs-news

It's Emacs Built-ins appreciation month! I'm coming to appreciate the menu bar more. What built-ins do you appreciate? Write about it and send Ross a link!

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

View Org source for this post

Emacs Chat 26: Ross A. Baker

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

: Added transcript.

I chatted with Ross Baker about Emacs (including running Emacs 28), his Emacs config, and life.

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

Related links:

Chapters

  • 0:00 Opening
  • 0:46 What Ross does
  • 2:06 How Ross got into Emacs, used other editors, and then came back to Emacs
  • 4:58 Config focusing on built-ins
  • 10:12 simple-orderless
  • 14:29 Size indicator
  • 16:40 Graceful degradation
  • 17:48 emacs-lock-mode
  • 19:52 exiting Emacs: yes-or-no-p
  • 20:46 yes-or-no-p
  • 21:45 Processes
  • 22:18 Moving keymaps
  • 24:23 Writing in Org Mode and Markdown
  • 27:49 Ethersync?
  • 29:16 Managing Github with Forge
  • 35:49 Committing with work addresses vs personal
  • 37:13 Emacs tinkering as stress relief
  • 41:06 Under-appreciated Emacs built-ins
  • 42:20 gptel
  • 46:04 Getting older
  • 46:46 Lindy's Law and tool longevity
  • 49:51 Nix is good at managing package versions and customizing them; Matthew Bauer (Bauer IDE)
  • 53:25 Custom fonts
  • 54:30 Starter kits versus configs
  • 55:34 Nix vs Guix; Mac
  • 56:26 Non-work interests: Org for documenting; ox-hugo and multiple languages

Transcript

Expand this to read the transcript

0:00 Opening

[opening stuff] Emacs Chat 26 is Ross A. Baker. You can find him at rossabaker.com. Today, we've got a lot of interesting things to dig into, including his two-part Emacs configuration, plus of course, all the things that he does. The goal with Emacs Chat is to show some of the things that aren't obvious from the configuration, like how the different pieces actually work together or what the workflow feels like. But before we dive into that, Ross, can you tell us a little bit about your background? What's the context here? What do you like to do?

Ross: Oh, sure.

0:46 What Ross does

Ross: So for work, I'm a backend engineer. I'm somewhat well known in the Scala community. I've done that for a long time on an open-source basis. I've taken an interest in Rust here recently. Those are the two primary languages I work in. I work for a financial company. We maintain the apps for small- and regional-sized banks in the United States. Fairly fun work there. It's kept me quite busy here lately. For other things I like to do for fun, like to go for a jog, like to push away from the computer now and then. So I go jogging every day, try to run about nine miles every day. My two big de-stressors are the running and the fiddling with my Emacs configuration, kind of opposite sides of the coin. But I need them both to stay happy, I think. That makes sense. Also a soccer coach. My kid is in high school and coached his recreational team. They have a lot of fun with that as well.

Sacha: Yeah. One of your blog posts mentions that you've been publishing your youth soccer webpage in ox-hugo.

Ross: That's right.

Sacha: Emacs can be used for everything.

Ross: It can, yeah. That's right.

Sacha: We're also very curious about how people get into Emacs and what makes them stick with Emacs.

2:06 How Ross got into Emacs, used other editors, and then came back to Emacs

Sacha: In your story for the Emacs Carnival in Take 2, you shared how you got into Emacs. Well, you were introduced to Emacs in 1997, but you actually left. You used other editors for a while because of work, and then you came back to Emacs. Was it primarily for Haskell and Clojure, or were there other reasons that got you interested in it?

Ross: Yeah, when I was at the Haskell shop, it was something that a lot... When you get out into the workplace, there's very few Emacs users, relatively speaking, in most workplaces. But when you're in a Haskell shop, that's what almost everybody uses. So being surrounded by that, that was a good reason to get back into it. I'd been dabbling in it a little bit before that, even. I had a really good time with it originally. I got into it like so many people did back then. I got into it in college, showed up, and that's what the professor was using. The first language that we learned there was Scheme, which is a Lisp dialect, so it's a natural fit there. Back then Emacs and Vim were the two dominant editors at that point, so it was pretty much one or the other. If you were learning a Lisp dialect in school, the professor was going to guide you toward Emacs. I got that initial shove and fell in love with it there. Then I got out into the workplace, and in the workplace back then, it was very rigid. You would have to use the commercial editor that was integrated with all the IBM software, so I had to use these specific things and I couldn't use Emacs anymore. I did dabble in Vim a little bit as well and I liked the efficiency of editing that came from both Emacs and Vim. Vim was easier to emulate than these other editors that I had to use. That had me on a Vim path for a little while. But then scripting it just wasn't as satisfying as Emacs. It was always really calling to me. I felt like I was in exile while I was outside of Emacs. Then, when I had a chance to start picking my own editor and customizing things again and getting up to speed with other people who were using Emacs, it was just natural to come home, and here I am again.

Sacha: Nice. Many people haven't had the experience of working with other Emacs users in the same company. So what is it like? Were you swapping lots of config around, pair programming, that sort of thing?

Ross: Yeah, pair programming, sharing config. I am fortunate at my current workplace, even though it's a much smaller percentage than it's been in some other workplaces. It's also a large company, and we have an active Emacs channel there within the company Slack. A lot of people are interested in it there, so I've got my little inside community in addition to the outside Emacs community as well. Fortunately, I still get that even to this day, so that's pretty fun.

Sacha: You're the second person has described the wonders of having a company internet channel on Slack, just about Emacs. Yes. Very awesome.

4:58 Config focusing on built-ins

Sacha: I'm wondering, with your current company, is that the reason why you have so many "gotta run with just the built-ins", "gotta run even if you've got Emacs 28"... Is that the reason for those kinds of considerations in your base config?

Ross: That was kind of a premature optimization that worked out very well for me. I used to run a very extensive config. I'd look at all the classic configs that would go out there and install all the packages from MELPA. I'd try them all out. I'd just accumulate these things. I went through some Emacs bankruptcies. Then people in the community started talking about, okay, Emacs 29, it added use-package out of the box. It added... I can't remember when project.el came along, but it added these things that started... You used to have to get them from outside, or you used to have these other libraries, and Emacs got a lot better out of the box. I started to say, okay, I'm going to do one more bankruptcy. I'm going to see what I can do with built-ins. I started experimenting down those lines, even though I was always using that extended config. I was challenging myself. How much can I get from a built-in config and then just have a little bit of extra for those gaps? Because there are gaps. I do love Emacs built-ins, but I am more comfortable with the regular one. But I challenge myself that way. This month, I got put on a project where I have to work in a sandbox environment. So it's not regular operating procedure, but I have to do all my work in the sandbox environment. There's no network egress. I have to say, okay, if I want packages in here, I have to talk to the admins of that system and say, I want these packages. I lobbied for Emacs on it. They thought, well, that's kind of weird, but it's just one more line of apt-get in the Docker container, so they're fine with it. It was an old version of Debian Bookworm. I was running Emacs 28. I'm like, okay, well, I've got this built-in configuration. This is its moment to shine. I tried to run it on there. I was able to copy the file up there. I tried running it on there, and I run into things I’ve been using setopt. I’ve been using one of the XDG packages for setting your X desktop group directories, so to have a standard place to put your config files versus your cache files versus your state files. In Emacs 28, they had most of those variables, but one of those variables didn't exist yet. So I felt a few paper cuts that way. Up near the top of my config, I've got a compatibility layer. The compatibility layer, there's a nice compat package out there. I can't remember. I think Omar, who you interviewed recently, I believe he's one of the people behind it. And tarsius, I think he's involved in that too. I could be misquoting on that. Maybe I'm misattributing that. But anyway, there's this wonderful compat package out there. If you're a package author and you want to have your Emacs package running on older versions, it's great for that. But the whole point of this is I don't have any external packages. So where I need this compatibility layer the most, I can't use this lovely compat package out of the box. So I had to reinvent a few shims. I think I could bring that up. Am I sharing my screen?

Sacha: Yes, you're sharing your screen. That was one of the things that immediately struck me about your config. You're so hardcore about not using external packages that even your adapting to older versions, you're re-implementing things yourself in order to be able to stick with your constraints. I think that's hilarious, by the way. You started it off with it as a personal challenge because, of course, people are allowed to set arbitrary challenges for themselves, and then it turned out to be surprisingly useful for you in this limited environment.

Ross: Yeah, that's one that really saved my bacon.

Sacha: Yeah, this is great. So even things like setopt… Then you have keymap-set. You’ve got some replacements for these modern niceties to make it still work in Emacs 28.

Ross: Yeah, I leaned into the new keybindings. There’s keymap-set, keymap-global-set, keymap-global-unset. Those are roughly the same as what you had in older Emacs versions but you don't need to pass the keyboard macro around all the things, so it's a little bit more concise. There were a few more advantages to it and I'd already been on Emacs 29 or Emacs 30 everywhere else. I'd already leaned into those, and then I got into this environment. But as you can see, they're fairly easy. This is not a 100% full fidelity. There's a few nuances that get missed in doing this, but for the most part, it works pretty well. I'm not aiming for perfect here. I'm aiming for "this works well enough at Emacs 28 for the life of this project, which should last about a month." And otherwise, I've got the nice full glory Emacs for my daily driver. It's straddling that divide fairly well.

Sacha: I just looked up when Emacs 28 was released. This is 2022, so four years ago.

Ross: Yes.

Sacha: A lot of Emacs has changed since then. But of course, Emacs being Emacs, there's a lot of effort put into making sure the old stuff keeps working, which is handy for these cases. That's great.

10:12 simple-orderless

image from video 00:11:23.700Sacha: So you have a lot of these shims, and one of the things that you've ended up re-implementing along these ways is a version of orderless that works without having to take the entire orderless package in there. Can you tell us a little bit more about what you like about your setup?

Ross: I wasn't happy with any of the built-in completion styles. Well, some of them are okay, but the overall... I had used orderless in my more extensive config. Orderless, for people who don't know, is a way of completing things. Let's see if I can show it off. So I can do... If I do "file" and "find"... Well, I thought it would work.

Sacha: Do you need a space?

Ross: Yeah, I don't know why the space wasn't completing. So I can do "file". "find file". I could do the space. I could do it in any order as well. Or I saw there was an "ido" in there. If I do it in reverse order, that's the idea of orderless is if I'm using the space, I got thrown off there. It was auto-completing a hyphen on me I didn't expect. Anyway, if I remember some tokens and things, let’s say I’m looking for ido-find-file, but I type "find" first and then I do... What orderless does is it takes the input and it splits it by space and it will find them in any order. It's a nicer completion style than I think any of the ones that come out of the box are. I got used to it. But if I'm in this lean config, orderless is something... It is not a built-in. That's something that I was leaving behind. That was one that was really starting to itch. Then I found this blog post by James Dyer where he'd implemented a very slimmed-down version of orderless. It wasn't the full features that you get, but it was something that was good enough that captured the basic principles of it. I took that. I found a few bugs in it, and I found a few more things. It was a very, very simple version of orderless, and I wanted a couple more bells and whistles. The completions weren't quite right to my tastes. I took that blog post. I ended up with a middle ground. It's not as good as the full orderless, and it's a little bit more extensive than the blog post that I found. But I'm able to run that, and I don't really miss the full features of orderless that much. There are all sorts of cool things that it does where you can say, okay, these are regexp tokens. These are literal tokens. These are NOT filters. You could do all sorts of combinatorial logic with it with various syntax. You can customize the syntax for it. It's all great, but I wasn't using those extended features of that package that much. I am happy with this lighter-weight version. That way I'm able to use it even when I'm off here in the security sandbox. I'm able to do it there too. It exposes the underlying tension of this setup. I would recommend 100% use orderless. It's better maintained. The maintainer is a lovely person. It's more full-featured. You can customize it. I ran into a little bit of a hiccup here and it's my own config. This is something, it's going to be more professionally maintained if you're using orderless. So if you're not adapting to my built-ins only method, I would 100% recommend using orderless instead. But because I have this constraint, I'm building this up. What I built up is kind of nice. It's one of the more interesting parts of my package, or of my config. I could spin it off as its own package, but if I spun it off as its own package, it's just a strictly worse version of orderless at that point, so what's the point? That's one of the tensions that you have in these built-ins, is anytime that you build something that is really interesting, you want to spin it off and share it, but at that point, you've defeated the purpose of being built-ins only.

Sacha: I think the idea then of looking at the packages that you really like and if you find that you're only using a subset of their functionality, being able to strip it down or take advantage of somebody else's work and stripping it down to the subset that you use makes it a lot easier for you to put it all together in your batteries included, built-in only configuration.

Ross: Right.

Sacha: It's not super long. It can be understood if you go through the function. So that's great. Are there other things like that that you find yourself wanting to extract from other packages?

14:29 Size indicator

Ross: I did this really weird little thing called size indicator mode. I'd already spun that off. I don't know if it was worthwhile or not. One thing is all of your list commands, they run things in binary bytes. When we say a kilobyte, what does a kilobyte mean? Does that mean 1,000 bytes or 1,024 bytes? Most of the commands that you run, they're going to be in these binary units. What you get out of the box in Emacs is the decimal unit. Their definition is 1000 instead of 1024. I thought, well, that's kind of weird. I built this size-indicator-mode where it goes and it translates things so it's unified across the way the coreutils work. It's the 1024 base instead of the 1000 base. Trivial little package, but it was a lot of fun I threw it out there. It's up on my Codeberg if anybody wants to pull that in.

Sacha: Yeah, so it just reduces the friction of having to think, okay, is this in this unit or is that unit? It'll always be in the units that you like to use when you're talking about files.

Ross: Exactly, yeah. It keeps things consistent that way. That's a package that I spun off. Is that something that... It's a very lightweight configuration. It probably could have stayed here in my built-ins. I doubt anybody else has that itch, but I shared it out there and a lot of people thought, ooh, neat. I think a few people did install it. I'm glad I spun that one off, I suppose. There's always that fuzzy line. Where does it grow into something that you think other people are going to be interested in, versus what are the ones that you should just keep in-house and they can always copy it out of your config if they're interested? It's a hard line to walk in this style. I haven't exactly found the balance yet, I don't think.

Sacha: A lot of your config isn't so much new functionality as it is just filing off the corners or making something a little bit nicer to use. For example, when I was going through your config, both the base config as well as the extended one where you have more packages and things set up, I was like, oh yeah, okay. You fiddle with your visual-bell, but you also, in your extended config, set it to mode-line-bell instead. That sounds interesting.

Ross: Right.

16:40 Graceful degradation

Ross: I go for graceful degradation. When I was doing web pages as far back as the 90s, when I was first into Emacs, everything was about graceful degradation as you had these new browser features. You're trying to use these new shiny things. I'm old enough. I've been doing web pages since before there were cascading style sheets. But anyway, as we were starting to do CSS and as we were starting to do JavaScript, it was all about progressive enhancement: do the shiny things for the browsers that can support it, but also have this nice baseline of functionality for those that can't. I've tried to do that with this base level config. I've got the visual-bell that's built into Emacs and it flashes the screen. It puts up this annoying triangle sign. I don't like that that much. This one, if I can make the bell ring... Oh, this would make the bell ring. Why is it not?

Sacha: I guess C-g doesn’t just automatically make it... Oh, C-g works for me, so I don’t know.

Ross: It usually works for me, too. I don't know why it's not triggering a bell here.

Sacha: That's OK.

Ross: Curse of the demo.

Sacha: Yeah, yeah. Anyone interested can go look it up.

17:48 emacs-lock-mode

image from video 00:19:01.733Sacha: Then you have a couple of other things around, for example, making it easier to not kill a buffer. I hadn't known about emacs-lock-mode either.

Ross: Oh yes, Emacs lock. Yeah, so there’s this emacs-lock-mode and it is not the same. It's easy to confuse this with the lock files. You know those files that you get the hash signs, like you get ".#name-of-the-file#". That's something from when Emacs was used more on multi-user environments. Whenever you had a modified file, it would create these lock files, and it would prevent two users who were editing the same file on their own Emacs from stepping over each other. How often in modern times are we working on a multi-user system? If it is a multi-user system, are they both using Emacs on the same file? That's something that was very important in the late 90s and is not very important now. This is not those file locks. This is a buffer locking, and with the scratch buffer... I've got this turned on. Evaluate it. Make sure it worked. Let's go to our scratch buffer. Here's my scratch buffer. I don't want to accidentally kill it. If I try to kill it, it's going to say "Buffer *scratch​* is locked and cannot be killed." I'll use this for notes all over the place. I've accidentally killed things too many times. The scratch buffer is not typically backed by a file, and I've lost too many things. This way, I know this scratch buffer is always going to be a persistent place. There are other approaches to it. I think there’s a persistent-scratch package that's out there. But again, that gets me out of the built-in zone. That might be a progressive enhancement, something that takes your scratch buffer and backs it with a file. That would probably be a good thing to do. So that's one of the packages I'll be looking at adding in the other config. But emacs-lock is built in. It's one of those things that's so obscure you can't even find it in the Emacs manual. It's just out there. I don't remember where I picked it up. I think just scanning somebody else's config I picked it up somewhere, but I couldn't find it in the manual at all.

19:52 exiting Emacs: yes-or-no-p

Sacha: I was going to ask you where you found it. You occasionally read other people's configurations for interesting ideas. And then you have a bunch of niceties. Actually, before I go into that, @Ray-On-Emacs has a question. "How do you exit Emacs then? Or do you never exit Emacs?"

Ross: I almost never exit it.

Sacha: I think the emacs-lock-mode for the Scratch doesn't kick in if you're closing Emacs as a whole?

Ross: Correct.

Sacha: If you're closing Emacs as a whole, it will happily still discard your Scratch buffer, but as Ross says, you could also not exit Emacs.

Ross: Yeah, I've got the flippant line in here: ¨Exit Emacs? Surely there's been a terrible misunderstanding,¨ But I do configure the way that I do it. I want to make sure that the confirmation of it, it's the yes or no.

20:46 yes-or-no-p

Ross: I don't want to accidentally hit that key binding, so I will use the full fledged yes-or-no-p`. That's one area that I diverge from a lot of people's common things. One of the very early things a lot of people set in their config is they’ll rebind this yes-or-no-p to the y-or-n-p so that way, they only have to type the one character. Emacs is fairly thoughtful about which ones that it makes you do "yes" or "no" versus the "y" or "n". The things that are quick and inconsequential, those are the ones where it gives you the prompt that it's just a "y" or "n" answer. The ones that are going to be more destructive and you really want to stop and slow down and think about, that's what the yes-or-no-p is for. People stomp all over that in their configs, and I think that's one area where I'm a little bit out of the mainstream. I like the defaults on Emacs there. It is thoughtful about which ones it prompts you for that on. But if I remember right, confirm-kill-emacs was one that was just a "y" or "n". That's one of the more dramatic ones that's out there. So I did customize that to make sure, yes, I really mean that.

21:45 Processes

Ross: Then there's some annoyances where if you've got a bunch of inferior processes running after I've already confirmed that I want to kill Emacs, well I just said I want to kill Emacs, so I didn't want to be prompted about the processes. I do quit Emacs enough I've customized how it shuts down. I don't do it that often.

Sacha: I imagine if you really want to stop yourself from closing Emacs, you might just change the key binding and make you M-x it instead in order to exit it, so you really absolutely don't run into that.

22:18 Moving keymaps

Sacha: In fact, your config has some of these lambdas where you are telling yourself, okay, this keyboard shortcut has changed. You have this thing in Magit, I think, where you're like, I moved the key map and now it's somewhere else. I thought that was interesting too.

Ross: I'm trying to remember what that one was called.

Sacha: There you go.

Ross: Yeah, the crab-juice--moved-to. I'll bind my old key map as I'm trying to move things around. I used to use Spacemacs for a while. I used Doom Emacs for a while. I've looked at a lot of the other configs and I've said, okay, this architecture makes a little bit more sense. I want to rebind my prefixes that way, but still, for the ones that are deeply ingrained, it's sort of like a deprecation warning, except for key bindings. It looks like I used to run on C-c g. So if I try to do that, it's going to say, nope, moved to C-c v c. And now I can do that. C-c v c, and there’s my Magit command.

Sacha: Yeah, I like that you actually ended up mapping the whole keyboard shortcut instead of just the C-c g one because, of course, your muscle memory is getting you to put in the whole C-c g and then something. This one lets you have the full keyboard shortcut before it tells you the message.

Ross: This is using user error. So I thought when I hit that one, I thought I would flash my mode line, but the mode line is not flashing. I know it flashes on my other machine. It flashes on my work machine. It doesn't flash on this one.

Sacha: The challenge is getting a config to work in many different environments. You've got your work machine, you've got this personal machine, and then you've got the sandbox one that's got a really old version of Emacs on it. Okay, so a couple of other things that you've mentioned.

24:23 Writing in Org Mode and Markdown

Sacha: You do a lot of writing in Org Mode as well, right? You've mentioned using the literal programming part of it a lot. You do a lot of work with Markdown. Do you have any interesting workflow tips for people who are finding themselves writing with either Org Mode or Markdown in a work environment?

Ross: That's always a tension as well. I would rather be in Org Mode. Org Mode has more bells and whistles. You can program more things in it. It's a programmable Markdown in a sense. I'm much more comfortable in Org Mode in general. Now, I don't use Org as a personal organizer as much. I would like to. I've dabbled in it a little bit. I've seen some of your previous interviews and people doing mind-blowing things with that. I'm jealous of what they're doing. I would love to get to that level. I'm still a relative newcomer to Org versus how old I am at Emacs. I'm a relative newcomer to Org. So I haven't embraced that yet, but I do use it as my general, if I'm writing a document by myself, it will 100% be in Org. This document that we're in, it's my entire website. My Emacs config is in here. My Nix configuration for how my systems work is in here. I like to do barbecue. Some of my barbecue recipes are in here. Just general blog posts about things that have nothing to do with technology are in here. It's all one big Org file. That style is emphasized. I'm using ox-hugo to take this document and export it to the website. They encourage having one big large file for that. I followed suit on that. That's why I have just this one giant document. In the work context, if I'm starting a small document, I'll start it in Org Mode. But then when I started in Org Mode, if other people want to edit it, we got a small Emacs community, so depending who I'm sharing it with, that might be fine. There's a couple people I can pair with on that. If I'm working with them, everything is great. But that's not something... There are Org implementations that work in other editors, but it isn't as good anywhere else as it is in Emacs. That's what everybody's going to typically use. And if they're not using Emacs, they're not going to be that warm to Org. I hate to say the dreaded two-letter acronym, but with AI, you're seeing a lot more Markdown. People are starting to program in Markdown. Markdown is bigger than it's ever been before. It's just unavoidable at this point. So what I'll do is I'll start a document in Org and then I can export the Org document to Markdown if I'm going to put it into GitHub or sometimes I'll just use Google. It really depends on how the collaboration model is. If I'm going to be collaborating with a lot of people up front and iterating real quickly, I'll do that in a Google Doc and I'll export that to Markdown. If I'm writing it myself as a first draft, I'll start it in Org and export that to Markdown. Markdown ends up being the target in the workplace for anything that's permanent though. I don't love it. I wish Org had won. All my personal projects, they'll have a README.org on them rather than README.md, but it is what it is and you've got to play nice with your co-workers too.

Sacha: Yeah, I find myself having a hard time remembering to switch the link syntax. I have a "do what I mean", just insert the link. I don't care what syntax it's in, just make it work.

Ross: Nice.

Sacha: You mentioned sometimes in your Zoom calls when you need to exchange notes with people faster, then you have to use Google Docs for that one because that's what they're familiar with. But there might be some easy ways for you to ship that back and forth between Org and Google Docs.

27:49 Ethersync?

Ross: One thing I'm really looking forward to is there's this project. I can't remember what it's called. Ethersync. Yes, thank you. I've seen some various attempts at that and I had a little bit of success with them, but none of them have lasted. I'm really rooting for that team. I feel like Emacs got rejuvenated. It used to be, okay, it was hard to use Emacs because if you're in a niche language and you're using a niche editor, you had to find a community that used both of those to have decent support. Then LSP came along. You have your language servers. So now I can write in these niche languages that not everybody's writing Emacs, but I still have a good experience thanks to Eglot and thanks to the language server provided by those communities. Emacs became viable again for doing a lot of development. And I'm hoping that Ethersync kind of becomes like the LSP of collaborative editing, where it's not something where it's only Emacs users sharing with each other, but it works across editors and people can collaborate in real time that way. That would replace that Google Docs use case I have. The only reason I use Google Docs is we can see each other typing and edit things on the fly together. So I'm very excited about that Ethersync project. I hope that takes off.

Sacha: Yeah, I think that will probably be more feasible than hoping people will switch to Emacs and then use CRDT. There are other interesting collaboration things in your config.

29:16 Managing Github with Forge

image from video 00:30:35.700Sacha: You've mentioned Forge. You have some things in here for cloning to different directories depending on the repository, committing with different addresses, confirming before merging pull requests. Can you tell us a little bit about these quality of life improvements for you?

Ross: Let me see if I can come up with an example here, first of all. So this is Forge for people who have not seen it. Let's do...

Sacha: So when you don't need something like real-time collaboration, for the people who are watching, Forge lets you manage your Git repositories with the pull requests and other changes and things like that, right? I don't use it yet, so... Yes.

Ross: Yeah, so it's essentially a GitHub client. So I was looking... I'm here in my Forge test directory. I'm trying not to share any of my work repositories. I use this primarily at work. I just set it up on this machine last night. Still probably a couple of rough edges. I can list the topics. And if I list the topics, I can see I've got pull request 20 open. I can hit enter on it and I can see, okay, it's open. It's in state pending. This is where it's going. These are the commits. I can look at the commit and see, okay, what is this person doing? Oh, they're trying to add another line to this file. And if I say, okay, that looks good. I can do, what is it? I can look at this and I can say... This works better if it is in a full screen editor. Let's do... I thought I was tracking this repo already. I had this working last night. Curse of the demo again. Anyway, I'm able to approve pull requests from this. I'm able to... Reject pull requests. I'm able to comment on pull requests. I can look at the diffs. So all of my integration with GitHub is done through this. I'm in an environment right now, I'm a staff engineer. I participate on a lot of teams. I get over a thousand GitHub notifications a day. The GitHub notifications that are built into the browser are just not sufficient. That's something I was able to pull it in with Forge. I'm able to tag things. I'm able to mass mark the things. I get a lot of infrastructure things that they're important, but they're not important to me. I get notified on them all the time through the various automations. I'll get them. I'll get a hundred of those at a time and I can just mark a region of those and knock out a hundred and say, okay, that's off my plate. Moving it into Emacs, as awkward as this demo is, it works great on my work machine. I'm able to keep up with things so much better than I was before. Let's see. I should be able to, if I want to look a little bit deeper and see things in the GitHub, at least this works.

image from video 00:32:21.833Ross: I can open it and see this directly. Then if I want to merge it from here, I can. Or I should be able to merge. Now I can do a regular merge or a squash merge or a rebase just the same as I have this button here. That's all built in here. Let's go ahead and merge this pull request.

Sacha: All right. That little detail about you dealing with like a thousand notifications a day? It makes the guardrails that you added to Forge in your config even more interesting because you can stop yourself from accidentally automatically merging in things that need more review or whatever, which of course is difficult to demonstrate at the moment because work stuff, private. But if other people are listening and thinking, they're dealing with a similar volume, you can modify Emacs to stop you from making mistakes like that. You can add just enough friction for the cases where you need to pay more attention. And @PuercoPop, there's a gh-notify package specifically for high-volume GitHub notifications. I'm not sure... Have you come across that one yet?

Ross: I'm curious what that looks. The term "notify" concerns me, like if it's helping me manage notifications in bulk, I'm interested. If it's going to pop up something every time I get a new notification, I'm very much disinterested. I don't know whether to be excited or horrified, but I'll take a look.

Sacha: I think because @PuercoPop is recommending it specifically in the context of high-volume notifications, it might provide you that inboxing where you can filter. I haven't looked into it myself, but I'm getting the sense that this is a problem that many people who use Emacs face and who solve it a very Emacs-y way.

Ross: Yes. Forge has all these nice things built into it already, but I wanted to customize the workflow a little bit. It's right here in the comments, the things that it does. It makes sure that it's mergeable, there's no merge conflicts, makes sure that all the status checks ran, makes sure that all the approval is done. One thing that the Forge does not do is it does not show you comments on your pull request. There's a code-review package that's out there. It's been through a lot of forks. I'm still integrating that into my workflow. I've got a fork of a fork of a fork that I have. This is life in Emacs, for better or for worse. I've got a fork of a fork of a fork of a fork so I can see those comments. I haven't fully integrated it with Forge yet. That's a work in progress. But anyway, I didn't want to be merging these things and ignoring if somebody's taking the time to give me feedback. I don't want to merge things because sometimes people will approve things, but they'll say, hey, just a little nit to pick. You got a typo here. Don't want to slow down progress, but you might want to take a look at this. If I'm just sitting here entirely inside of this, I'll never see that. So this also checks for unresolved threads. I've got some embedded GraphQL inside of here that makes it all work and we grab that data from the GraphQL and then I'm able to just do this inside a list and prompt on these things and if it finds there's anything that isn't right it gives me these safety checks along the way and yeah it's really nice.

35:49 Committing with work addresses vs personal

Ross: One other issue that I had was we had this requirement at work where we needed to start committing with our work email addresses rather than our personal addresses. I use my same GitHub account for work and personal. I needed to get that moved over. To do that with GitHub, you need to do those merges via the API. I've got things configured. All of my work repositories are partitioned off into their own subdirectory of my projects directory. I've got a git config that sets my email address to that. So if I'm doing things locally, it works. But if I'm doing these API merges that are necessary for certain repositories with certain safety checks, I needed to be able to thread that along. I've got a bug fix in here for that, where I'm threading along that email address that reads my git config and passes that along to the API endpoint. Otherwise, it was committed as the wrong identity. There's a few things here that I'd like to contribute upstream to Forge. Some of it is very bespoke to me, and some of it I think would be useful to everybody. I need to tease that apart still.

Sacha: I like your technique of separating things into different subdirectories and so that all of your work stuff goes in the work directory or all of your personal stuff goes into projects or whatever. Then you can change your settings based on the location of the project. Even cloning a project will automatically pick the right directory to put it in. I saw that in your config. That's pretty clever.

37:13 Emacs tinkering as stress relief

Sacha: I'm curious because a lot of people find it challenging to balance the workflow improvement I get to tinker with Emacs versus actually getting work done, the time balance between those two. It's a little hard to figure out sometimes. What is this like for you when you're sitting down, you're doing some work, and you realize "There's probably something that I can write to make this smoother?"

Ross: I've been doing Emacs off and on for about 30 years now, and when I get that balance right, I'll let you know. I don't have it right yet. I know I spend more time tweaking things than I probably should. It's a stress reliever for me. I get tired of doing the other things. I still love computers. I've loved computers since I was six years old. Got my first computer then. My aunt got me a book on programming when I was six. I started going through that book, and I was off to the races on that. I relax by doing computers. Some of the open source chaos is a lot to deal with, and using the same languages that I use at work that feels too much like work, so being able to withdraw and just tweak things... "Okay, this irritated me." It's a combination... From a pure productivity perspective, I overdo it for sure, but I guess the stress relief if I would burn out otherwise... Maybe I'm getting it right after all. It's hard to say.

Sacha: Besides, you might also be able to say to yourself, well, I do have some Emacs co-workers. I'm sure they can benefit from this too.

Ross: I do.

Sacha: You're helping them out too. Okay, I want to dig into some of the things that you have around improving Emacs' capabilities as a self-documenting editor. You have some configuration snippets that make getting help easier. I hadn't come across them before, so I wanted to make sure other people knew about them too. Like your thing about making apropos look at all the things and sort by scores. It can sort by scores? What kind of scores are we talking about? How does this work?

Ross: One thing that I have done, a little bit off-topic for the question that you've asked, but I have linked everything very aggressively to the info manual where I found things. Sorry, I got caught in a recursive edit here. So let's open this. What was that doing? I'm also struggling because I've been very busy at work lately. I'm used to the Mac key bindings again. I'm back here on my Linux machine. I haven't adapted to the Ctrl versus the Cmd. So yeah, all apropos commands will sort their lists or results in alphabetical order. If sort by scores is non-null, they try to guess the relevance of each result. My comment looks like it's a little bit obsolete here because it looks like for the documentation, I do like the sorting by scores, but for regular apropos, I did not. I think I tweaked something and didn't update the documentation.

Sacha: That's okay. I was just curious about it. Then you also have some things like, if it's an autoloaded symbol, then go ahead and load the library so that you can get help for it. If there's a shortdoc example, include that as well in the documentation of a function. So if people are reading configs for ideas, I thought I would call attention to this part because it sounds really handy.

Ross: Yeah, I found these. I've just been going through... Part of my relaxation...

41:06 Under-appreciated Emacs built-ins

Ross: This is such a dorky thing to say, but part of the relaxation is I'll go through the Emacs manual looking for things. The overall structure of this document follows the Emacs manual fairly closely, and that's not by coincidence. I've just been going through chapter by chapter. Okay, well, I started with Emacs 19 or whatever. Emacs 31 is around the corner. I better at least catch up to all the goodies that are in 30. I'll read the manual, and I'm finding a lot of these things there. That's why I have so many links back to the manual inside of my code, just because I'm going through that. That's where you can find a lot of these hidden gems. I'm hosting the Emacs Carnival this month, and it's the underappreciated Emacs built-ins. I said, if you want to find any of them, go in the manual. They're there by the bushel.

Sacha: It feels almost like a book club. We're going through the manual together and finding all these gems that I wouldn't have come across otherwise, because Emacs source code is too big and all that. I've been really appreciating the Emacs Carnival submissions thus far. Of course, there are lots of other things that are not in Emacs that you've also been exploring and checking out.

42:20 gptel

Sacha: Am I allowed to ask about the gptel stuff?

Ross: Of course.

Sacha: I was curious about how the quick lookup stuff has been working out for you. What kinds of things do you like to use that for?

Ross: That's one that it was pretty exciting and I haven't really fully worked it into my workflow yet. I tried it. I liked it. I haven't internalized it. I was trying that one night. what what is capable of is you can just highlight something and do. It's almost like a quick Google search, except it'll bounce it off the model of your choice. It will pop up things a little bit faster that way. For the most part, I'm just using stock gptel, where I've just got the chatbot window. I'll copy a region and I'll put it into gptel. I'll run it off the model, say hey, I got a question about this, help me with this compile error, help me with that, and so forth. I don't... Talking about AI is always difficult because it's such a controversial thing and to use it at all, you offend a lot of people. I'll say, I don't really buy into the agentic workflow. I'm happy just using things as a chatbot and little snippets here and there where I'm still firmly driving. So the people who are fully bought into it, they don't think I'm using it right. Then there are a lot of ethical concerns that I share. I don't have the gptel on this. I use it for work. I don't use it personally. That's just the way I've been able to compartmentalize all my concerns with it. But just being a technologist, being a principal staff engineer, I do need to get up to speed with these tools. So I have had to get used to them and keep up with what they're capable of and what they're not. At least for my... Setting aside all the concerns around environment and whatnot, all the other concerns that we have with it , I find that GPTel is that sweet spot where I've just got this pair programmer where I can run things off, bounce a few questions off it, get things, but it's not getting write access to my file system. I have a security background. Worked at a security company for several years. Just the access that people are giving to these agents, I find absolutely terrifying. There's a lot of work that goes into using that properly, I think. I get most of the benefit. I feel like I'm de-skilling myself a little bit less than I do when I try the agentic workflows elsewhere. So I love gptel. Now gptel, it does have this interesting agent mode. I haven't tried it yet. Again, I have some security concerns around that. I need to figure out how to make sure that whatever I give it write access to... It's not getting too much write access to anything. But that is a project that's on my radar as well, to try to do things that really do benefit from this unattended work. I'll dabble in that as well. There's a whole gptel ecosystem. Karthik does an amazing job with that.

Sacha: I like that you have a very considerate approach to it. I also like the humor with which you describe this and other things in your config. You aren't buying into the hype. You're like, this is your least unfavorite way of doing things.

Ross: Yes, exactly. There's some commentary out on one of the nuclear test sites about "No deed of honor is performed here." I've quoted some of that in this part of the config too, just kind of my protest of doing this. I've got to do this and there are certain ways... If I have to do this, these are the ways that work for me. I'm getting some benefits out of this, but also I don't entirely feel great about this either. That's kind of how I've compartmentalized that.

Sacha: Yeah, that makes sense.

46:04 Getting older

Sacha: One of the other things that you joke about a couple of times in your config is getting older. So with things like your repeat-exit-timeout and your mode-line-bell-flash-time, you’re like, okay, might change it to track my senescence. I appreciate your sense of humor. Are you finding that there are things that you like to tweak about Emacs in anticipation of change as you get older?

Ross: Well, my font size is definitely bigger than it used to be. I guess that's something that has changed over the years. I used to be able to operate on a tiny font, no longer on that.

46:46 Lindy's Law and tool longevity

Ross: I guess Emacs and aging just feels like I made a really good... I wish I'd stuck with it for the full 30 years. I'd be fumbling around a little bit less in this demo. I'm not as smooth as somebody who'd been on it for the full 30 years, so I regret that time. I've just seen so many editors come and go. And when I talk to junior developers, I do a lot of mentoring. Like, I'm not necessarily going to say that you should go down this road, but if you do go down this road, it is something. that is probably going to be richly rewarding for you for a long time. There's this thing... I think it's called Lindy's Law. I'm sure I've quoted it here somewhere. The expected lifetime of something is proportional to how long it's already existed. And with Emacs... Emacs has been around... I'm very old. I'm 47. But Emacs is a little bit older than I am, depending on how you start counting. Emacs has been around for a long time. It doesn't have the market share that it used to, but it's something that still has a viable community. You do the Emacs News every week. You know probably better than anybody else how viable the community is right now. It's still an exciting place to be. I don't see that changing anytime soon, whereas I've seen so much hype over... Everybody wanted to get on Atom, and now Atom is a basically dead editor. Sublime had this rise and fall. So many other editors. Now I see people... VS Code was dominant for a while, and now I see a lot of people abandoning VS Code. It's still the dominant editor, but you can start to see people moving away from that. Emacs is always going to be here. So just as I've aged, I appreciate that Emacs, that same thing that I was using back when I was 18, a freshman in college, it's still working for me at 47. And by the time I hang up my keyboard, pretty sure I'm still going to be using it. It's done a remarkable job aging gracefully. Would I want to use the Emacs 19 today? Absolutely not. Am I fully comfortable using Emacs 28 in the sandbox environment? Yeah, there's certain things that I miss. But yeah, Emacs 30 is great. Emacs 31 is around the corner. It's kept up with the times. We just talked about AI. Emacs and AI, for all my concerns about AI, Emacs and AI are a great fit for each other because so much of the AI stuff that we're doing is text-based. Emacs is the best text processing platform that there's ever been. They fit each other so well.

Sacha: Yeah, yeah. And I find it very amusing that with you at 47 years old and I'm 43, assuming math is right, There are people in the Emacs community who would consider us still young whippersnappers.

Ross: That's right, yes. Different demographics around here, that's for sure.

Sacha: As well as, of course, the other end where you have high school students and fresh grads still enjoying it, still exploring it. And so it's great that we can customize this with larger font sizes or different key bindings or other ways to catch us from making careless mistakes to adapt to us and the things that we're working on. So all this is very interesting.

49:51 Nix is good at managing package versions and customizing them; Matthew Bauer (Bauer IDE)

image from video 00:53:01.300Sacha: Oh, actually, on a different tangent, one of the things I was curious about is a lot of your configuration is set up to work well with Nix. Since a lot of people in Emacs are curious about reproducible configurations and systems, could you tell us more about Nix and your experience with it in Emacs?

Ross: Yes, so I'm using that as some people use straight.el to pin their packages. Some people, they don't bother pinning their packages at all. I'm using Nix for people who are unfamiliar. Nix is... Boy, the elevator pitch for Nix. It's a package manager, but it's more than an Emacs package manager. It can manage all of your packages for you. So I'm building Emacs with Nix. I'm declaring all of my packages that way. Then that's specifying... I have a very repeatable build of Emacs and it has this version of these packages. One thing that Nix is very good at is it's very good at customizing certain things. So if you want to run a patched version of a particular package, you're able to specify, okay, I want this package, I want to use this package definition, but I want to overlay these files on top of it. Nix excels at that. I'm running a lot of customized versions of various packages, things that I've tried to submit upstream, and the Emacs package might be abandoned, or they might be a slow maintainer. I need to use it today, and they'll get around to it, and they'll merge it in a month. So on a temporary basis, I'll want to run a patched version. Nix makes that workflow very smooth for me where I'm able to run patched versions of certain packages, like I'm running a patched version of Forge like I showed off. Some of the things I want to contribute upstream, I've got those pulled out. I just need to sit down and actually submit them upstream. But I've got those ready to go and I'm able to run those out of the box. It's able to run... It's not just managing Emacs. That's the real magic of it. If I need certain binaries to support my Emacs config, I can declare those, and that all comes together and if I pull down Emacs packages, those are all going to be there together. There's a really fantastic example of this. Matthew Bauer has something out there. It's Bauer, I-D-E. B-A-U-E-R is his last name. He has one of the very inspiring configurations to me where he builds everything in Nix and he bundles all of his binaries that he needs in Nix and then he configures his Emacs variables to point, not at the git that happens to be on the file system, but to the git that he installs via Nix. So he knows that the entire thing is self-contained. That's something I've taken a lot of inspiration from. If I'm on a machine that has Nix, I'm able to run this. If I want to run my standalone config, I can run this command and I can run this command on any machine that I have Nix installed on. It will run very fast here. Should run very fast here. and this popped up and this is my base config and I could have run this on any machine or the my packages are named. It's an old Simpsons joke when Homer is stuck in New York. So that's the khlav kalash and crab juice. I think I've got a link to the YouTube video somewhere in my config. And there's the fully built in one. That's something I can get on a new machine. I install Nix. All of my dot files are there. If I want to just run Emacs or if somebody else wants to run my Emacs, anybody can take that config and run it.

53:25 Custom fonts

Ross: Now if you do that, a word of warning. One thing that I've done is this font that you see is a custom font. I took the Iosevka font and I customized a lot of the glyphs on it. When I do that, I build that in Nix as well. You can use Nix to build your fonts. That's part of my derivation. My Emacs config depends on my fonts. If you try to run these, you're going to have to compile the fonts. I compile a lot of variants of these fonts. I compile a lot of alphabets. Linguistics is one of my hobbies. I love to work in these other alphabets and things like that. I'm very opinionated on these things. Even in languages that I don't speak, I like the text to look a certain way. Just one of the other ways I blow off steam. But anyway, I've got this custom font that I use everywhere. It's the font on my website. It's the font that you see in my editor and my terminal. If you pull this package, you'll get my font and you'll have to compile that and you're going to heat the room with your CPU for about 30 minutes if you do so. So beware on that. Otherwise, if you want to run my config, it's all out there if you have Nix. I don't know how practical that is, but it makes me feel good.

54:30 Starter kits versus configs

Sacha: Now I'm curious, have you heard from people using your base config or your extended one?

Ross: I've heard of people copying out of it. I haven't heard of people depending on it directly. I would generally discourage people. That's kind of the difference between a starter kit and a config. You did an excellent series here on starter kits recently. I don't see this necessarily as a starter kit. This is very opinionated to the way I do things. I hope people look at it. I hope people draw inspiration from it, copy from it. Absolutely. But I'm going to change things on a whim. If you're using this as a base layer, you're going to find my opinions thrust upon you. You're probably not going to like half of them.

Sacha: Well, your config is very nicely documented and rather enjoyable to read. So I can imagine people will get a lot by reading it for the things they can copy and paste to their config. I also particularly like how even your code snippets, you've customized it to include the license. So it's like every little bit of that is easy for people to copy from confidently.

55:34 Nix vs Guix; Mac

Sacha: Trevok has a question. Hopefully without starting a philosophical war, why Nix over Guix?

Ross: I would love to run Guix, but I have a Mac for work and Guix doesn't have a good Mac story. I'm sharing a lot, not just my Emacs configuration, but a lot of other configurations, because Nix is more broadly scoped. I'm able to share a bunch of things between those two operating systems. So the server that I run, the rossabaker.com, that runs on NixOS. This laptop that I'm on runs on NixOS, and then I have the Darwin machine. There are certain things that are compatible between Linux. There are certain things that are compatible between the workstations. And then Darwin has its own weird area. I'm able to manage all of that with Nix. I couldn't do that with Guix. If Guix gets a good Darwin story, I will switch tomorrow, because I would love to be configuring with Scheme.

Sacha: Totally different tangent yet again.

56:26 Non-work interests: Org for documenting; ox-hugo and multiple languages

Sacha: Do you use Emacs for your other interests? You've mentioned things like you use it to publish your youth soccer homepage. What about for your aquarium or linguistics or other things you're interested in? Tell us about the non-work uses of Emacs in your life.

Ross: That would mostly be just documenting things in Org Mode. Like I mentioned, it's a big Org doc, and if you read this doc, you'll see that it's a very sprawling thing. For the linguistics, one thing with ox-hugo is that integrates nicely. I know you've been learning French. I think that's cool how you're doing that. Spanish and German are my two hobbies. I've actually got a trilingual site. The English is way more populated than Spanish and the German. Those are afterthoughts. I learned Spanish in college and I learned German in high school. I just try to keep current with that, but I'm not particularly fluent in either. There was a wonderful IndieWeb Carnival that came up. It was called Multilingualism on the Web and that's when I sat down and I'm like, okay, I want to do this. I'm going to write this article and I'm not just going to write it in one language. I'm going to write it in all three languages that I speak. Hugo has these facilities for taking the same article and publishing them on all three sites and linking them across each other. And ox-hugo, that passes through. ox-hugo uses Hugo as a compilation target. ox-hugo, I was able to set the metadata on there. If you've noticed my file name in this editor... I name everything after Simpsons puns: cromulent.en.org. And then I also have... I do have them separated by language. Here's my Spanish document and then, very predictably, here's my German document. By doing this in Org Mode with ox-hugo, I'm able to link together the posts that are translated into multiple languages. And then those all appear, if you go out to the Hugo site, like the rossabaker.com, you can go there and anything that's available in multiple languages, that'll show up. You can click through the Spanish or German translation of those.

Sacha: I didn't notice any shortcuts in your config for quickly switching to another, like the Org mode source in a different language for the same post. Would you happen to have any conveniences like that, or do you just manually switch to the other file and then find it?

Ross: I just manually switch to that, but the data is all there. The file names have to line up, so that's definitely a helper I could write. If I can find time to get back into this, that would be an excellent. I love your idea.

Sacha: Yeah, because I figured, if you're going to write something, you might want to switch between languages very quickly. If you make an edit, okay, "I'm going to add this thought to it. I want to switch to the other ones."

Ross: Yeah, typically I'll just take care of that with a split window and I'll have the two up there that way. That way, I'm comparing them side by side. That's probably why I haven't had that yet, but it would still be nice to see, okay, "I do want to make a quick edit in there." It would at least scroll me to that point in the other window quicker.

Sacha: If you add more language-related stuff to your extended config, I'm very interested in what people use to look up dictionaries, look up example sentences, and things like that. @blaiseutube says, "Recovering linguist here. English, Spanish, and French for work. Japanese, Portuguese, Sanskrit, and Swedish for fun." So I'm guessing there are a lot of linguists or people who do language learning as a hobby who use Emacs. It's great because you can switch to all the different input methods very easily too. It's all text. Oh, this is fantastic.

Ross: For all the diacritics that we don't have on the US layout keyboard, the C-x 8 key binding. Autocomplete if you need an obscure Unicode character, and it'll autocomplete on all those. So, okay, I want nice little built-in there.

Sacha: Yeah, on Linux, I've just been using setxkbmap to switch my layout temporarily, but I also like just being able to set the input method in Emacs in case I just want to write something quickly, then I can just C-\, I think. Okay, I've got about one minute before the kid does lunch break. Thank you so much for doing this. Was there anything that you wanted to pass on as a key tip that you'd like people to know from your experience with using Emacs? What's something we haven't mentioned that you'd like to share?

Ross: I guess I didn't mention the things that I think are exciting outside. We talked about the built-in configs, so the things that I missed the most, I would say... Well, I guess look at my crab juice config. Those are the packages that I found that I absolutely cannot live without. Magit, a few language modes. You can get by on the built-in thing a lot better than you think, but there are a few things that are out there that are the really special ones, and I think that's the distilled essence of that. Just take a look at that package. Those are the ones that, yeah, I tried really hard on the built-ins and I failed. These are the ones I really need. I'd encourage people to take a look at that as well.

Sacha: All right. For folks who are watching, you can find all of that stuff at rossabaker.com. Thank you so much. You've got links to your GitHub and Berg. Thanks to everyone on the stream for hanging out and for sharing your questions and comments. I almost forgot to mention [@ispringle] had a tip about putting emacs-lock-mode on a keyboard shortcut so you can toggle it if you wanted to. Nice idea. Again, thank you everyone. We're going to end the stream here. I will work on the transcripts and all that stuff. Thanks again Ross for doing this, and I'll see everyone around probably in September or October because I have to be on summer vacation.

I'll update this blog post with the transcript. https://sachachua.com/blog/2026/06/emacs-chat-with-ross-a-baker/

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

Chat

  • Ray-On-Emacs: ​​How do you exit Emacs, then? Or do you never exit Emacs?
  • pratikmishra4073: ​i stealing that lock mode hack. i too have killed scratch buffer accidentally before.
  • ispringle: ​`(global-set-key (kbd "C-c l") #'emacs-lock-mode)` is handy for one off locks too
  • PuercoPop: ​​There is a gh-notify package specifically for high volume GitHub notifications
  • blaiseutube: ​​I keep procrastinating my return to emacs 😔
  • gr1maldi: ​​Yo, and stuff. Sorry I'm late.
  • Ray-On-Emacs: ​​Getting older! Oh boy! more tell me, please
  • dubstepandlovee: ​​fantastic chat so far! as a local agent user, gptel-agent looks like an interesting project
  • Trevoke: ​​Hopefully without starting a philosophical war, why nix over guix?
  • dubstepandlovee: ​why nix over lix
  • dubstepandlovee: ​(joke)
  • Trevoke: ​​shakes fist in F/OSS Thanks for the answer
  • blaiseutube: ​​recovering linguist here. English Spanish and French for work. Japanese Portuguese, Sanskrit and Swedish for fun.
  • blaiseutube: ​​c-x h ? I love it
  • sachactube: ​​Maybe C-x 8 RET
  • blaiseutube: ​oh! thank you
  • Ray-On-Emacs: Thank you!
View Org source for this post

Emacs PDF View: Replace current page with file using PDFtk

| emacs

I needed to replace a page in a PDF with another PDF. This was a bit of an annoying process on my iPad involving copying and pasting pages in Noteful and then re-exporting them as a PDF, but it was easy to do in Emacs thanks to pdf-tools and PDFtk.

;;;###autoload
(defun sacha-pdf-view-replace-current-page-with-file (file)
  "Replace the current page in PDF View with FILE.
Requires pdftk."
  (interactive "FFile to insert: ")
  (let ((temp-file (concat (make-temp-name "pdf-view") ".pdf")))
    (call-process
     "pdftk"
     nil nil nil
     (concat "A=" (expand-file-name (buffer-file-name)))
     (concat "B=" (expand-file-name file))
     "cat"
     (format "A%d-%d"
             1
             (1- (pdf-view-current-page)))
     "B"
     (format "A%d-end"
             (1+ (pdf-view-current-page)))
     "output"
     temp-file)
    (rename-file temp-file (buffer-file-name) t)))
This is part of my Emacs configuration.
View Org source for this post

Emacs Chat 25: Ben Zanin (@gnomon@mastodon.social)

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

: Updated the transcript

I chatted with Ben Zanin about music, Org Mode, Emacs in terminals and on an Android, keyboards, elfeed, and more.

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

Chapters

  • 0:00 How Ben got started with Emacs
  • 2:19 Ben got into Emacs because of twittering-mode
  • 4:30 Emacs as a media playback platform with Versuri and Mpdel
  • 9:13 Emacs on Android with Termux
  • 13:44 Keyboards and other devices
  • 16:44 Benefits of a split keyboard
  • 18:22 Meeting workflow
  • 21:11 Narrowing
  • 22:58 There's even an internal Slack channel about Emacs at Ben's company
  • 24:50 Ben keeps Org capture templates as individual files and adapts them to different meeting flows
  • 28:45 Personal-scale software and the journey
  • 34:07 vc-git-grep for finding notes again
  • 36:55 Add keywords to make things easier to find again
  • 37:47 Keybindings and terminals; wezterm
  • 42:38 Timers: tea-timer, tmr
  • 43:57 Different stages of package use
  • 44:47 Elfeed
  • 48:36 Spoilers
  • 49:53 Comparing different news sources
  • 53:13 Bookmark naming conventions
  • 53:24 Naming conventions simplify building new workflows
  • 53:50 elfeed-curate for annotations
  • 55:46 mytoots archives Mastodon toots
  • 57:06 Mentoring offer
  • 58:02 A local instance of public-inbox can let you use Gnus to read mailing lists quickly

Transcript

Expand this to read the transcript

0:00 How Ben got started with Emacs

Sacha: I forgot to ask you how your last name is pronounced.

Ben: Oh, Zanin.

Sacha: This is Emacs chat number 25 and here I am with Ben Zanin. You have a math background and now you're in IT. Where did you encounter Emacs in the journey?

Ben: So the reason I have a math background is that I wanted to get into programming language design and at the time so that led me over to lambda calculus and that kind of thing and at the time it was at the time I was getting into university in like 2005-2006 It was impossible to get into the computer programs, but I could get into math. I figured that would move me in the direction that I wanted to go in, so I did. Got to third year, and then every professor who taught any of the courses I cared about all left the faculty at the same time.

Sacha: Oh no!

Ben: Yeah. Anyhow, that's a different story. But yeah, I got into Emacs because in the process of learning about Lambda Calculus, the Lisp weenies found me. And yeah, I spent a bunch of time learning about that. And it wasn't until like 10 years after I got into Common Lisp and Scheme that I actually got into Emacs at all.

Sacha: That's interesting. Usually people, like, if they're doing Lispy things, they get into Emacs right away because Lisp. But okay, so 10 years after. You're already well-used to parentheses at that point.

Ben: Yes. But I guess it wasn't until about ten years ago, like around 2015 or so, that I started really getting into Emacs. I would still consider myself to be a beginner on that front.

Sacha: Oh yeah? So what got you to get into it more?

Ben: I found that I was looking for more structured data management processes. Basically, I was looking for personal information management. And I kept bouncing off Emacs because I wanted to get into those tasks, but Emacs was such a rich learning process that I kept getting sidetracked, so I kept bouncing off of it.

2:19 Ben got into Emacs because of twittering-mode

Ben: But I have to admit that one of the things that originally actually got me into Emacs was twittering mode. Oh yeah? Because I was looking for a tool that would let me, we'll probably get into this later in the chat, but I was looking for a tool that would let me keep a larger window of context about the conversations that I've been in. The Twitter apps and the Twitter website implemented a really narrow window. I wanted to be able to search back a couple of weeks for stuff that I had seen or talked about previously. Twittering-mode gave me the ability to keep days or weeks of context in a single buffer that I could then immediately search. So I didn't actually get into Emacs as a text editor, I got into it as an application platform, and then gradually learned the rest of it. This is actually fantastic. So I kind of stuck around after that.

Sacha: That is the first time I've heard of someone coming to Emacs because of Twitter.

Ben: No, it's deeply embarrassing.

Sacha: No, it's wonderful. I love that there's just so many reasons why people come and the fact that you could find something that would let you take those notes and see that context and reply to it, and even, as I see in your config, work around slow keyboard response issues.

Ben: And also the fact that that's still in the config despite Twitter itself... I think I abandoned it in 2017, but it takes me a little while to rip things out of my config.

Sacha: Yeah, I see you're a lot more active in Mastodon these days. I see your Monsterdon posts scrolled by my feed every so often. Yeah, so we dove right into that because a lot of the stuff in your config is interesting and your workflows too. My idea for these Emacs chats is to show people the kind of stuff that isn't immediately obvious to newbies when they're looking at someone's config. Because a lot of the stuff is new workflows and how the keyboard shortcuts work together and how this stuff fits into your life. That's not immediately obvious from the code. I've taken a look at your config, but before we jump into the gazillion things I wanted to ask you about, are there things that you particularly love about your Emacs workflow?

4:30 Emacs as a media playback platform with Versuri and Mpdel

image from video 00:07:24.567Ben: I'm probably going to get a little bit of deserved flak for this, but I use Emacs a lot as a media playback platform. I spend a lot of time using Emacs to listen to music through MPV. And I've got some integration with Versuri, which lets me... I think you've seen those customizations where what I've done is I've kind of duct-taped the two together. Versuri is an Emacs package for being able to quickly search through lyrics for songs. What I've done is I've bound Versuri to the point where I've pulled up a page of lyrics, I now have a hotkey that bounces me over to a search of my MPD library for where that song is, and vice versa. I've got MPD rigged up so that when I've got a song currently playing, I can bounce into Verisuri to display the lyrics for that particular song. Something you probably have not seen in my config yet because I haven't finished it yet... What I'm working on is actually integrating Org Mode with MPD, because I'd really like to be able to streamline my process where occasionally when I'm listening to something, I'll take notes either about the lyrics or about the song. I'd like to be able to link from Org Mode directly to either that song, that album, or that particular timecode. I don't have that yet, but I'm working on it. I think I'll probably lean on it quite a bit once I have it.

Sacha: Yeah, yeah. I saw your tweet from May, I think, where you're talking about coming up with this way of taking notes. think if you come up with maybe a custom Org Mode link type that can store the annotation and then let you go to it, I think that would be really interesting. Especially if you figure out, okay, like, are you taking notes in the album? Are you taking notes on the song? Are you taking notes on this moment in the song? That could all be very cool.

Ben: Actually, do you mind if I share my screen?

Sacha: Please.

Ben: So one of the things I wanted to kind of note was... Let me... Oh yeah, this is actually going to be further embarrassing. I'm a terminal Emacs user.

Sacha: I saw. Can you increase the font size, though?

Ben: Absolutely, yeah.

Sacha: Resizing your terminal so it's smaller makes everything look bigger...

Ben: Is that better?

Sacha: More. Some of us are older. Thank you.

Ben: One of the things that's kind of unusual about my MPD configuration is I've got a satellite config. Sorry, the line wrap is a little bit off here. What this means is that I have... the household file server maintains the MPD library, but I've got multiple playback nodes around the house. What that lets me do is...

Sacha: You can play stuff on this...

Ben: So what this means is that I'm controlling the... well, in this case, that's a little MeLE Quieter3C that I've got in the living room that's kind of like the the home media server, the home playback machine. Fundamentally, I'm an ops guy, I'm a sys admin, and I've got, unfortunately, a fleet of machines around the house. What this lets me do is easily control each one of them. Instead of each one maintaining its own library of music files, the file server itself indexes them, which means that library updates are almost instantaneous, instead of having to read over the network to pull metadata out of each individual file. So having a satellite setup lets me... The real benefit is that MPD tracks albums, directories, and files as URLs. That means that I have a single global namespace of URLs for all of the media that's currently in the library, which means that I can annotate from any machine, but have it mean one thing. It makes it convenient for navigation, but it also makes it convenient for keeping notes, which I'm currently doing manually and working on those Org link types to be able to make it a little bit more smooth than it currently is.

Sacha: So you've got your central store of music files. You've got URLs for them so you can talk about them. That's just one identifier per song. You've got multiple speakers that you can use your completing interface to say, okay, I want to play this over there. You have Emacs controlling all of that.

9:13 Emacs on Android with Termux

Sacha: Now, is that Emacs on your laptop and you just take it around and you say, okay, I'm going to sit in the living room for a little bit or whatever and play there. Or do you... Ah, there you go. That's what I was going to ask. All right. So Emacs on your phone. The Android port or Termux?

Ben: I have both installed. I think you actually saw this a few months ago when I was running performance comparisons between the Termux version of Emacs and the native port, and found that the native port generally ran anything CPU-intensive roughly twice as fast. But I still use the Termux version because it's... I'm not sure if you played around with the Android terminal virtualization layer at all, but it's not great. I really appreciate the integration that Termux gives me with Android features. For example, being able to query the sensors, such as GPS or temperature sensors, and I can actually pull those in from the Emacs side. And that's something I kind of want to get into.

Sacha: What do you think of using the temperature sensors for? What can Emacs do with that?

Ben: It's not so much the fact that I use the temperature sensors as that when I pull the sensors, that's the most remarkable value that I get out of it. But one of the interesting things is the barometric pressure sensor, which gives me height, which matters because when I'm out and about and if I stop to record an entry in my journal, for example, I'll just pull the sensors and dump them into the header in the entry that I'm writing. The barometric sensor, I'll get the GPS, so that'll tell me what the actual height is at that location on the earth. The barometric sensor also gives me a little bit of insight into the weather. So it's not so much the temperature sensor is what my temperature is, but just like if it's a hot day or not.

Sacha: I am very curious about that setup. So if you happen to share your, I don't know, Org capture for Termux that includes all these things... You don't have to show me the actual stuff, but you know, at some point I think other people will be curious about what kind of benefits they can get from running Emacs on their phones.

Ben: So, I mean, I guess I'll... One of the benefits that I get is the ability to keep shopping. So I'm a little bit of a militant cyclist. One of the things that I often do is leave

image from video 00:12:04.333Ben: notes about things that I need to take care of in particular areas of the city. The nice thing is that I can just drop them directly in commits right as I'm going. So I often have a long list of updates that are from Emacs on my phone, just because it's convenient. All right. There we go for Monsterdon, in fact.

Sacha: Nice, nice. Then that's Syncthing or whatever else to just get it copied back to your laptop or just on your phone?

Ben: Straight Magit mode.

Sacha: Oh, yeah?

Ben: That's one of the things that I found was a little bit clunkier when I was running virtualized Emacs under the Android emulator and also the native Android port of Emacs. They are a little bit more troublesome to get Magit to work. Because I rely on that for syncing back and forth from my phone, that's one of the reasons why I stuck with Termux.

Sacha: Very cool, very cool. I like Termux's little bar of extra keyboard keys that you can have, so you can have a regular keyboard and then you can just have your Controls and your Alts and whatever on that little extra bar. Termux is quite interesting.

Ben: I think I'm probably pushing it harder than it is meant to be pushed.

Sacha: That's the fun of it. I don't exactly know how everything will shake out, but probably with Google trying to lock down the developer ecosystem in a few months, right? They're saying, oh, you know, it's got to be ADB in order to get these unsigned apps on. We'll have to see how it all shakes out. But I'm hoping Termux can survive because I like that one too.

Ben: Yeah, me too.

Sacha: Okay, so you've got interesting music, an interesting music setup with lyrics and playback and all that stuff. You've got your phone, which also runs Emacs and from which you can, you've also set it up so you can control your music from your phone?

Ben: Yes.

Sacha: Okay.

13:44 Keyboards and other devices

Sacha: When I was reading through your toots, I noticed you like to play around with other keyboards and other devices like the 8BitDo. Do you have any of that talking to Emacs too?

Ben: [Keychron B11 Pro is] the keyboard I'm currently using. I got this so I could keep it in my purse and just like walk around with it, but it turns out it's super comfortable and I'm accidentally using it as a daily driver.

Sacha: All right. Name-drop the keyboard for all the people who like the device recommendations.

Ben: It's a Keychron B11 Pro. It runs ZMK. ZMK, I suppose. And if you've seen me interacting with Pete Johanson on Mastodon, he's the lead developer of that firmware package. It's a little bit like QMK, except that fundamentally QMK is a polling architecture, and it works really well for very restricted microcontrollers. ZMK is interrupt-based, which means it is tremendously more efficient in terms of power draw. So if you want a Bluetooth keyboard, you should probably run ZMK on it. Anyhow, yeah, it's fantastic. And I do have a bit of a keyboard problem where I tend to...

Sacha: Many Emacs people have keyboard problems.

Ben: Right? I feel like I'm in good company right now.

Sacha: Yeah, yeah, yeah. So, devices, yep, gotcha. And this has become your main keyboard even for regular computing?

Ben: In the last couple of weeks, yeah. It's super comfortable. Because it's so flat, I can get away without having to use palm rests to actually keep in a decent posture, because of the curvature of it.. Like, it's an Alice layout. The key travel isn't too bad. It's actually quite comfortable. I found that I needed a little bit of acclimatization to get used to split keyboards. This one has roughly the spread of a split, but it seems to be easier for my muscle memory. So yeah, I didn't intend to leave it on my desk, but it stuck and has kind of stayed there for now.

Sacha: Does it have any special ergonomics for all the modifiers that we like to do? Or do you just use Caps as Control or whatever else?

Ben: Actually, I don't use Caps as Control and I actually really need to get into remapping that. ZMK has a very rich remapping story, as I expect you to imagine, from a custom firmware. The macros are intense, and you can get really deep in customization. I have done none of that on this keyboard yet, because it's only, I think, a couple of months old at this point.

Sacha: You've been settling in. As you said, this has been your main keyboard for a little while. Charlie Baker says, "yeah, I love the split keyboard. Recently bought one myself. I was getting so much neck pain, you know, shoulder and neck pain from so many hours keeping hands close together." But the split lets his shoulders relax. So probably you're getting the same, like, ha, my arms.

16:44 Benefits of a split keyboard

Ben: The two things that I first noticed when I moved to a split keyboard was one, my wrists started feeling a lot nicer and two, I was immediately able to bench press like 20 pounds more the next week. It was amazing how much of a difference it made and it showed up in the data.

Sacha: Wow. There was a weightlifting talk at EmacsConf last year, I think. So there's a surprising overlap between the people who are checking their weightlifting stats and the people who are into Emacs. Naturally, with Org Mode. There you go.

Ben: Let's not look at those numbers too closely. I'm not too proud of a bunch of them. But yes, I find that Org capture templates let me keep on top of that and not really think about it, which is great because you don't want to think about it. You want to gather the data and think about it separately so that you can stay emotionally divested from what the numbers mean.

Sacha: I know. I'm totally happy to dig into the Org capture, especially if you do any graphing. People always love graphing their progress, right? But if you're like, I don't really want to show my numbers at the moment, that is also understandable and okay.

Ben: I don't, I'm afraid. Sorry.

Sacha: That's okay.

Ben: It took me a couple years to get used to being on camera at all. I don't really like my appearance very much. I'm working on that, as you can see. I've had to work on that to be able to work remotely. It's a work in progress. I'm getting through it.

Sacha: You know us. We're very much focused on text. In fact, you even use Emacs in the terminal. That's very text-y.

18:22 Meeting workflow

Sacha: One of the interesting things actually that I wanted to ask you about since you mentioned meetings is you probably also have the role of designated note-taker. You mentioned in one of your toots that you take notes and people are like, what are you doing that in? How are you taking your notes? And it's Emacs.

Ben: Yes, so actually that's one of the things I should lead off with as an apology. I probably won't be able to share many of my capture templates because I don't use them in my personal life very much. They're mostly on my work machine. I've got capture templates for impromptu meetings where it's just like an exploratory, we have a problem we need to solve, we're kind of talking through a discussion, a separate capture template for meetings with agendas to make sure that we stay on them and that we log decisions, and a separate set of templates for... So I have a team of direct reports and they each have different cares and different topics that we're working to develop in their professional careers. I find that it's really useful to be able to keep some continuity between our conversations. It also makes it very easy to export that entire dataset, share it with them to make sure that they can consult it at the same time. If I got anything wrong, I can fold their corrections in. But all of those templates, unfortunately, are on my work machine.

Sacha: We'll just sketch out the general idea in abstract details and then people who want to implement it for themselves can fill in the blanks. For example, when you're having a meeting with your direct reports, are the tasks related to them in an Org agenda? Are you using dynamic blocks? Is it tracked somewhere else or is it in Org?

Ben: It's straight in Org mode. So most of the touch points that we have are more about professional development and their cares and concerns, rather than specific deliverables. Usually deliverables we manage at a team level. But if there are specific things that individuals are working on, they will be in to-dos under their subheadings in a way that show up on the agenda if we have assigned deadlines for them. But generally, if there's a deadline on a task, it's because I'm doing something and they need to track it, or they're doing something and I need to track it. If I'm the only guy using Emacs, then Org Mode won't work for that, so there aren't a lot of those. But if it's just something that I need to check up on to make sure that something that... Like they've got planned leave for example, or they have a cousin's wedding that they need to go off to, or something that I just need to keep in my brain that's not necessarily deliverable, then it would be appropriate to keep that in a place where it'll only show up on my agenda. So that's the kind of decision making that I apply there.

21:11 Narrowing

Sacha: And you mentioned you have a subheading, I guess a subheading per person or sort of... Or do you use tags to keep track of something that might touch several people?

Ben: Usually a section per person, and that's more of a convenience than anything else. That lets me narrow to just that subheading and share my screen during the meetings. Then I don't have to worry about accidentally leaking anybody else's information into the screen share or anything like that. Obviously we let off with conversations about them being all right with that. But the ability to very clearly and simply delineate "This domain of my notes pertains to this person" and being able to be confident and share that confidence that there will be no leakage means that we can explore topics and talk about them in a way that might otherwise be a little bit more restrictive. So being able to do that simply, and being able to establish a very clear delineation around whose information belongs where and where it should be shared turns out to be pretty valuable.

Sacha: Yeah, and that's a technique I think that especially people who are new to Emacs and who aren't used to narrowing and widening might not know how to use effectively. I think narrow is even one of the commands that's disabled by default. You've got to say, yeah, you know, I'm not scared. I know what to do.

Ben: Yeah, it's kind of bizarre to me that it is, but yeah.

Sacha: I can imagine people accidentally triggering it and they're like, oh no, the rest of my file is missing. But if you know how to narrow to a region, and Org even has those commands to easily narrow to a subtree... I think it's even part of the default speed command so you can trigger it right from a heading. But it's great for that kind of restriction.

22:58 There's even an internal Slack channel about Emacs at Ben's company

Sacha: Okay, so the reason why I was asking about that is because some people are working with people who are not using Emacs, so it's very interesting to see what the kinds of... It's very rare for people to work with other people who actually use... Are there any other Emacs people in your company, for example?

Ben: There's an entire Emacs Slack topic about that, yeah. It's kind of great.

Sacha: What is that like to have co-workers who do Emacs? Because this is a rare experience.

Ben: It's super cool. It's also neat to see the very, very different ways that people use it. But yeah, oftentimes people will talk about problems that they have with particular internal tools, and somebody's like, oh yeah, go check out this repo on GitLab that I published last week where I got sick of it and decided to solve that problem categorically. It's actually super cool. And some of the folks at... Generally, I tried not to mention my current employer at any point. Obviously, it's not secret. It's in the init file. But yeah, I don't tend to get into that deeply. But some of the other people who work at my company, they maintain venerable Emacs packages. So it's awesome to be able to go and talk with some of the folks who I've been working on the code that I've been using for a decade and we are now coworkers. It's lovely.

Sacha: Oh, that's so nice. I'm glad you have that kind of little community in there.

Ben: Yeah. Bunch of nerds.

Sacha: So I suspect some people will be looking up your company after this. I think it's also mentioned in LinkedIn and sort of like, okay, let's see if there's any job openings.

Ben: If it's mentioned on LinkedIn, that is somebody else. I haven't logged into LinkedIn in 15 years and I never will.

24:50 Ben keeps Org capture templates as individual files and adapts them to different meeting flows

Sacha: We do have a question from Shae. Shae is asking, how do you make a capture template to stay on agenda and record decisions? You got any tips for that? I'm guessing this is more of a human thing rather than an Org thing, but maybe you have some ideas on how you keep something on track.

Ben: So I'll actually push back on the "It's a human thing rather than an Org thing". I strongly believe that one of the real values of Org Mode is that it's a very plastic system. Fundamentally, I think that it is a human system because it allows you to express exactly those kinds of trade-offs in a really, really fluid way. I love the personal information management that Palm Pilots provided, for example, but it was pretty restrictive. One of the things that I love about Org Mode is that if you find that a particular person has a particular conversation style, it's really easy to modify your Org Mode capture templates to be able to capture that particular flow that you have with that person. Or with a particular group of a recurring meeting, for example, that tends to flow in a particular way. Super easy to update the templates that I use to capture those particular meetings to make it easier to match the general conversation flow with the notes that I will be taking about it.

Sacha: Wow, that sounds pretty sophisticated.

Ben: Well, I mean, that's the thing. It's not sophisticated. It tracks the human process very easily. So it's really lightweight. So you don't have to have a lot of sophistication to make it very, very useful. You just have to have a feedback loop that you can tune every time with one or two minutes of effort. And that's one of the reasons why I depend on Magit mode so much is that it lets me track those things. But yeah, to answer Shae's question about how do I track those particular things. So if it's a meeting where one of my direct reports has a particular set of topics that we tend to investigate, like somebody who's concentrated on career growth. So we're talking about the areas in which we want to see development. I'll absolutely update the capture templates for that particular person to say, all right, here's what we talked about last time. Here are the things that were done between our last two conversations about how we move in that direction. Were they successful or not? Did it require a lot of effort? So was it something that more effort should be put into to be able to drive down the work over time, to be able to produce those results? But yeah, that goes into the templates and that goes into the cadence of conversations that we talked about in Capture.

Sacha: So that's really interesting. You modify the capture templates with the notes that you want to have easily available the next time you chat with them.

Ben: Exactly, yeah.

Sacha: The capture templates are still defined as a setq somewhere in your thing, or are you going into the customized interface?

Ben: So I actually keep the capture mode templates as raw files that are referred to, and that makes it easier to version them in a way that like, I mean, sure, like my Emacs init file, if you look at the Git history of it, it has a whole bunch of different...

Sacha: I had not considered having capture templates as files files. It worked out really well.

Ben: So you can see that... It's a little bit hard to see with the font this small, but you can see that I've got a lot of changes to, for example, my init file, but keeping them in individual capture mode template files makes it a little bit easier to just look at the history of that particular file and see why particular changes were made.

Sacha: I'm going to try that. I think that's a great idea because it allows you to be a lot more granular about the notes.

28:45 Personal-scale software and the journey

image from video 00:28:28.300Sacha: I saw in that very brief flash of your change log message that you like to write fairly detailed commit messages that talk about why a change was made instead of just "a new function, new command," very terse updates that I sometimes just try to get away with. Tell us more about that, because I think you've had a couple of toots about reading source code and reading commits.

Ben: Yeah. So I guess one of the things that I most appreciate about software in general, and specifically personal software, like personal-scale software that's been written by an amount of people that you could fit into a room to have a conversation about it... One of the things that I most appreciate about that is that almost all software written that way is fundamentally a diary about the way that a person learned how to solve a set of problems that they might not have known about when they decided to at the beginning. It's this fascinating process of tracking somebody's voyage through the problem landscape as they discover other people who have touched on topics that are tangential to the problem being solved by that software package. It's such a personal and fascinating experience to see somebody go from "I know just enough about a problem to be able to decide that I want to build a machine that works on it" to "I have this deeper understanding of how the problem actually exists in the broader set of things that people care about, oriented along the axis of what machinery can do to help solve parts of that problem." The commit logs for a program are like a map through that territory. It's wonderful to read. It gives you a lot of insight into the person doing the navigation. When you see 16 commits on December 24th of 2023, like, that person probably had a little bit of time to work on it. Then, when you see a bunch of commits that are 5 p.m. Monday to Friday, like, okay, this is probably done in a particular way. It's this deeply personal process of seeing how problems are learned about. I just really appreciate that.

Sacha: I think what you're saying about personal-scale software and getting a sense of people's journey as they learn to understand a problem and as they start to prototype a solution... Because you never quite come across the right solution the first time around. You're figuring things out, You're borrowing things from other people. I think that will resonate a lot with lots of people in the Emacs community, because Emacs use is so personal, as you mentioned when you were looking at the Slack channel. I was wondering, in your personal practice, as you figure things out, what kinds of things help you? Is it mostly a matter of actually sitting down and taking the time to write the literate programming stuff around the code blocks or the commit messages, or are there other tools or techniques that help you do that? Are there tools or techniques that help me write down your journey along the way as you think about the code? What's your practice? For example, when you come across something that you want to figure out, how do you go about doing it?

Ben: So it depends on how I'm approaching the project. One of the neat things about software is that it's a document and a device at the same time. You can care about it because of the thing that it does, or you can care about it because of the information that it captures. If I'm digging into a program because it does a thing that I want to learn, then I'll pay attention to the device aspect of it. That usually means that I'll start with its own documentation. If it has a man page, I'll read that. If it has user docs, I'll read those. Usually, I'll start keeping notes in an Org Mode file, because it's easy to hyperlink back to it and add my own annotations in parallel to the actual authoritative source. If I'm reading software primarily as a document, then I'll start by reading the source code and the commit logs, usually the most recent ones, and then I'll jump back to the beginning of the project and read upwards at the beginning, and then fill in the blanks iteratively, if it's a project that's small enough or has little enough history that I can do that. Again, I'll usually start an Org Mode file specific to that particular exploration that will let me organize my notes as I go. I really do rely on the external brain that I can keep in an Org Mode file. I tend to have a pretty decent long-term memory, but being able to bridge the gap between short-term memory and long-term memory is super, super useful. Leaving myself hints that let me dredge things back out of long-term and reload it into the hot cache of short-term really, really helps out, because that lets me maintain that flow state or get back into that flow state. When you've got like the whole program, all the context that you've absorbed up until now and the ideas of the areas that you want to investigate, being able to hot-reload all of that and then pick up where I left off is super useful. But the meat brain can't do it. I need the machine brain too.

34:07 vc-git-grep for finding notes again

Sacha: Tell me about this dredging up process. Are you a lots of little files person? A couple of large files? A project file, there's an Org file in each project that you look up? How do you find things, especially if you don't remember the exact words?

Ben: So it's usually like an Org Mode per category, and they get consolidated. Let me shrink this down a little bit. So usually it's an Org Mode category per file. If there's something super specific, then usually it'll live out in its own place until I get around to...

Sacha: I love that you have an Org File specifically for Mug Cake.

Ben: But that's the thing. It'll live off in its own thing until it gets integrated into the list where the long-term stuff lives. I promise this is pertinent to your actual question.

Sacha: No, no, this is very pertinent.

Ben: Usually, lots of little files while I'm still working on something, and then as that something becomes part of my larger life and has links to other things,

Ben: then it'll kind of get centralized into one of the Org Mode files that has a broader topic purpose basically.

Sacha: If it's very long-term and you can't remember the exact words to find something, how do you generally find find your notes?

Ben: That way.

Sacha: You start grepping various keywords and try to find it.

Ben: Yeah. So one of the things that I don't yet have turned on, and actually you inspired me to look into this, was so... Actually, do we have enough time? Yeah, okay. I'm just looking at the clock. One of the things that I wanted to get into was long-term searching and searchability. Yeah. So I use SQLite's indexing for a lot of things, and I really appreciate its porter stemming because it lets you search for stemmed words, which are kind of approximate matches, which is useful, but less useful than vector databases. You actually put a little bit of work into indexing topics based on vector similarity.

Sacha: Which I haven't gotten back to, so I'm glad to see you managed to experiment with it, see what you come up with.

Ben: I don't have anything to show yet, except that it's an interesting topic. Because I'm word-oriented, I will often remember individual keywords, or I'll have enough patience that I can sift through a list of potential keywords as I'm grepping for stuff.

36:55 Add keywords to make things easier to find again

Ben: If I find that my first three or four attempts at searching for a keyword don't find the topic that I'm looking for, once I do eventually dig up the topic, I will add those keywords that I was searching for just so I can find it next time, expecting that future me will probably behave more or less like current me. But yeah, being able to use a vector database to search for headings that include related topics instead of related words... I'd really like to get there. I'm not there yet, and I think that's going to be interesting and useful. I also think it's going to be challenging to represent Org Mode's hierarchical structure to restrict the training of particular vector sets to be able to cast an increasingly wide net for where I want the searches to run. I don't know how that's going to be solved yet, but I'm going to be looking into it.

37:47 Keybindings and terminals; wezterm

Sacha: @PuercoPop has a question regarding terminal Emacs. "Do you need to change any of the keybindings to avoid clashes with the terminal?" Some keybindings don't work on terminals, or some terminals already have these keybindings set.

Ben: So I have good news and bad news there. The good news is that... One of the terminals that I'm using right now on most of my systems is Wezterm. It's really good. I started off with [meant to say Kitty], and I kind of bounced off that project because of some of the behavior of the lead developers. I won't get too deep into it, but what I found is that Wezterm... It gives me very little friction that way. It doesn't have a lot of its own keybindings, and that's a relief. It means that I really don't have to... I don't think I've had to put any time into customizing Wezterm to get out of the way of Emacs or Screen. I should mention, I am running Emacs within Screen, so that introduces another layer. C-a a, for example, is beginning-of-line for me, even though C-a itself is the default Emacs keybinding. But yeah, I think that I ended up choosing terminal software specifically on that merit, so that it doesn't get in the way. That's actually one of the things that Termux is... The default Google keyboard keeps stealing key bindings. It'll update, and all of a sudden, I can't use a particular Alt key combination anymore, because now it invokes a Google keyboard shortcut for pulling things out of the Android clipboard, for example, which is really kind of annoying. But yeah, in terms of terminals on full-fledged machines, I generally don't have that particular problem. Except for... What was the name of it? It was... It was a zap-to on-the-screen package that alphapapa wrote, I believe, that I... Actually, let me just look it up. Yeah, Avy.

Sacha: Oh yeah?

Ben: So I wanted to start picking this up in 2021, and yeah, control colon doesn't work in terminals. So the mode itself is fantastic, and when I'm using it in a GUI Emacs, it's very useful, and I rarely use it now specifically because of that particular terminal problem. That is self-inflicted. That is not a problem with the package. That is a me problem. But yeah, I think this is the notable one that I bounced off of.

Sacha: Yeah, just trying to find the right, you know, a key binding that will pass. Because you can't get used to key binding in one system and then not have it available in other systems. It's just going to mess with your brain. So yeah, Ray points out, yeah, Google steals Control Shift K, which he uses to kill tabs to the right. So it's like, oh.

Ben: Infuriating.

Sacha: Yeah, yeah. And of course, none of the standard keyboards have a super key on the thing, so you can't just tack on another modifier that'll get through.

Ben: That's actually one of the reasons that I picked up this particular keyboard is Brian Carlson. Another Torontonian. He works on Git LFS and some other stuff. He was specifically looking for a keyboard that had a super key that he could remap. So four keys to the right of space, which this one has. And because it's ZMK, it's remappable. I think this might be suitable for his purpose, except that he wants a QMK keyboard, specifically because the development tools for QMK are packaged in W, and that's a plus for him. Anyhow, yes, I agree. Like, not having a super and a hyper key on a keyboard

Sacha: feels like like one of your fingers that are cramped up we need more modifiers well I mean you know pipe organ Tell us about that.

Ben: What is this? Oh yeah, foot pedals. Yeah, and I actually do have these wired into a little Atmel microcontroller running QMK. I honestly tried the foot pedal thing for a little while. It was hilarious. I did not find it useful.

Sacha: I don't have the hand-eye-foot coordination to do that thing at the same time.

Ben: Maybe if I had learned piano as a kid, it would have been good. But yeah, I don't seem to be able to do it. But I gave it the old college try and it was fun.

42:38 Timers: tea-timer, tmr

Sacha: Okay, I had a couple of things I wanted to ask about in your config. You have two types of timers. You have tea-timer and you have Prot's TMR. Do you use them for different purposes? What's going on here?

Ben: So I'm trying them out. I tried TTimer first because it was the first one that I found, and it was useful. I was actually using it in meetings because I would, when I was trying to keep us on topic, I would use that to remind us that, oh, we've got four other topics we need to get through. We're trying to give this one five minutes. We're running up on four. And it was just because it was super low overhead. It was easy to pick up. It was easy to have it displayed on my screen. And it didn't feel like I was... Running a chess timer on everyone. It's very subtle in the mode line. It was useful. But what I found was that when I was... Running multiple timers simultaneously. TMR, just the fact that you can list all the timers and manage them in a separate buffer. It's richer and I appreciated some of its documentation more. I haven't fully switched over to it yet. I'm still in exploratory mode. In fact, this is probably like... So I actually have a bunch more packages installed than I'm currently using. So I'm going to shrink this down a little bit just so that it doesn't line wrap.

43:57 Different stages of package use

Ben: But yeah, so I've got, I think about 140 packages locally cloned. I've got, as you can see in my init, about half of that actually installed. There are various phases. I've got a clone, but I don't have it in my init. Or I have it in my init, but there's another package that offers similar functionality. Or I'm all-in on this particular choice and I'm removing the other ones. It's a gradual kind of progression.

Sacha: Yeah, we're all auditioning packages to see if they fit in our workflow and all that stuff. I was curious also about your elfeed things. You have a few things related to elfeed. Actually, do you want to talk about the thing you just highlighted first?

Ben: No, we'll get back to it in a sec. I'm keeping an eye on the clock.

Sacha: But yeah, elfeed.

44:47 Elfeed

Sacha: Yeah, you've got a couple of interesting things in your elfeed setup, including picking a search from a bookmark or other shortcuts like that.

Ben: So I have discovered in my conversations with the new maintainers for elfeed that my elfeed habits are very deviant. So let me actually start off by going through... You can see that like the top of my elfeed list is kind of in one format and down at the bottom, the ones that are closer to present day are organized in a different way.

Sacha: You've got tags now.

Ben: So my feed list is, I mean, it started in Google Reader. It's kind of been forward ported since then. It's long.

Sacha: I love the comments.

Ben: But one of the consequences of having a long feed list is that I have an enormous elfeed database. And I use it for completely different purposes. So for example, I'm going to show off that little default search. I keep an eye on projects that have releases that aren't packaged by Debian, for example. So I've got this little ATS Mini. basically a small AM FM radio that happens to run on ESP32 and the firmware for this community developed and it's kind of interesting but like that's not packaged by Debian so I pay attention to or I subscribe to the release feed for that particular project. I do keep in keep an eye on the Linux kernel especially these days because The gallop of security vulnerabilities coming out of mythos analyses right now means that I have to pay more attention than usual to fresh updates. So generally I run Debian stable, but I do run kernels from backports and I want to know when those are available. MeshTastic. I was paying more attention to this a couple of weeks ago. I'm not going to reach that right now. But yeah, the local MeshTastic community in Toronto is plagued by a couple of griefers that make it a lot less fun. So I'm paying a bit less attention to that right now. But yeah, so like one of the bookmarks that I have is software currency. Another one is, for example, the YouTube channels that I subscribe to. Thank goodness for Elf YouTube. It is so nice to be able to get the transcripts for things directly in there.

Sacha: There's even a sponsor block integration so you can skip all the promotions and stuff.

Ben: Yeah, I mean, so again, my use of YouTube is also deviant in that I pretty much strictly subscribe to RSS feeds and they're downloaded onto the file server. So when a new recording comes out, it gets dropped there. I'll watch it. And then I've got a little widget that scans through my Kodi database for watched files. Once YouTube files show up in the watch list, they're automatically purged. And it means I just never see an ad. It's not just satisfying. I don't think that I would be able to pay attention if I was being constantly interrupted because of the way that my brain works. But yeah, so being able to quickly search for YouTube is one thing.

48:36 Spoilers

image from video 00:48:40.433Ben: I do have articles that I've marked as spoilers for media that I haven't watched or read yet. Maybe I go to an extreme degree, but I'll try to avoid previews for new movies, for example. I do want to actually go back to them later on. Marking articles as having spoilers that I want to revisit later on is an easy way of not having to worry about it anymore. For a while, back in the days when I was paying more attention to... Enter the Dragon was the sequel to... What was that TV show? George R.R. Martin... Seven seasons and it went badly off the rails in season six.

Sacha: Game of Thrones.

Ben: Thank you. So when I was watching that for a while, several of the sites that I was reading would have individual episode updates. I really appreciated having a list of Elfeed keywords that I could automatically apply those tags to. I wouldn't even see the headlines because it was problematic enough. I've become less...

Sacha: Nice.

Ben: I've been putting less effort into maintaining that now, but the infrastructure is still there, and I can lean on it if I need to.

49:53 Comparing different news sources

Ben: One of the things that I don't have set up right now is a quick search for the municipal topics that I cover. I tend to subscribe to a lot of news because I found that, for example, it's interesting to see how the Toronto Star covers stuff differently from other local newspapers. It's useful to be able to quickly pull up the five or six publications that cover news in the same way and then look through the annotations for them or add the annotations myself. I can see that this particular story was covered by this journalist in this publication in this way, and then it lets me cross-reference so that I can pay attention to topics that are under-covered or publications that habitually leave out particular aspects of news stories. It lets me pay more attention to the trends of publications as well as to the stories that they're covering. The consequence of that is that my Elfeed database is 4.5 gigs. It's common for me... I don't know if that actually shows. It's common for me to have like 65,000 articles in like the six month horizon for the default Elfeed searches. That means that searches and redraws are expensive, even on a relatively performant machine. You've probably seen some of the workarounds that I've got. This little bookmark selector is one of those workarounds. Elfeed's interactive search: super, super useful. But if you're trying to do it like this... Actually, it's not so bad.

Sacha: I love this. When you see someone using Elfeed for 65,000 items, you get a sense of what it can be used for when you're really stressing it.

Ben: And the organization of the bookmarks that I have means that I do have one river of news of all of the things that I want to pay attention to. But it's seven or eight pretty divergent topics with not a lot of overlap. It's neat to be able to think of Elfeed as the thing where news information comes in. The individual bookmarks are the topics that are grouped together that I actually care about and want to read about in concert with each other. If I specifically narrow it down to just Emacs stuff, one of the things that I can easily do is add a bookmark for that search. If I name it... Now that I've got that bookmark saved...

Sacha: And then it's like, bookmark annotation.

Ben: Right. It ends up in my dot file as a git commit.

53:13 Bookmark naming conventions

Ben: Now that that bookmark exists, simply because of the naming (elfeed-search-...), now it shows up in completion.

Sacha: Precisely this sort of stuff. I am under-utilizing bookmarks, I think.

53:24 Naming conventions simplify building new workflows

Sacha: I love this idea of using bookmarks with a naming convention and then writing Emacs Lisp to take advantage of that naming convention to make that easy to jump to, easy to use in other things.

Ben: Yeah, it means I don't really have... When I notice that there's a thing I don't have, it diminishes the activation energy for building a new workflow. It means that I don't have to put a lot of thought into it. I can quickly do it. If it turns out to not be useful, I can quickly get rid of it.

Sacha: Very cool.

53:50 elfeed-curate for annotations

image from video 00:54:52.533Sacha: I had one more thing that I wanted to ask you about elfeed that I want to squeeze in, in the five minutes that I have before the kiddo comes out for lunch break. This elfeed-curate that you're using, this is the first time I've come across it in the config. Are you sharing your notes or your selections with other people, or just for yourself?

Ben: No. It's just for myself. What I'm trying to replicate is, back in Google Reader days, I really appreciated how when you added an annotation to an article that you were reading, by default, that annotation would be viewable by other people in your social graph. That was super interesting. Sometimes you could also add personal-only annotations. Actually, I don't think that's the keyword that it uses. I think it’s just +ann.

Sacha: Also, because you have an Emacs keyword on it, so I don't know whether you have any annotated Emacs ones.

Ben: Yeah. Well, I mean, generally, if I've added an annotation, it will be. So, for example, here. Right? Super useful. Well, super useful for me, anyhow. If I find that there's an annotation that is more... This is inflammatory. It doesn't need to go out on the web.

Sacha: Sorry, did you need me to kill the stream? I have a 10-second window.

Ben: No, it's all good. I'm not worried about sharing this, but it's not something I've posted. What the nice thing is, is that if it is something that I want to share, it's really, really easy to just drop this into Mastodon mode.

Sacha: Very cool.

Ben: That's one of the ways that I use it. Because the annotations are just Org Mode files, you can add links to other things and it becomes just as useful as anything else.

55:46 mytoots archives Mastodon toots

Sacha: You're saying this can flow into Mastodon and from there, once you toot it... I think you're using mytoots that you mentioned in your config for archiving it? Or searching, yeah, okay. Oh, except it's currently not working.

Ben: Yeah, I don't have it loaded right now. So mytoots, it just loads the backup of your export archive. So it loads the... What's the most recent one? So yeah, it was your outbox JSON file, which is the most recent one here. I've got an Org Mode reminder to download it roughly quarterly. My outbox is about 100 megs right now. Compared to 4.5 gigs for elfeed, it's not so big. That's not going to redraw properly. I was just going to show it. My resident Emacs memory size right now is about like five or six gigs. It's a little bit embarrassing. By comparison, 100 megs of JSON in RAM is not so bad, but having an instant search for everything that you posted and being able to bounce back from your local archive to the conversation thread that's live and see anything new that comes in... Again, it lets me exercise that outboard brain kind of idea. So yeah, mytoots is super useful.

Sacha: I like it a lot.

57:06 Mentoring offer

Sacha: The last thing that I want to ask before the kiddo (because I have two minutes) is that you have a mentoring offer pinned in your Mastodon, too. Have people taken you up on it, especially if they've taken you up on Emacs? Is that ongoing or forgotten about or whatever?

Ben: Not forgotten about. Very much real. Still open. I haven't refreshed that offer recently, but it's still pinned for a reason. I think maybe a dozen or so folks have asked for that. 9 or 10 success stories, I think. Nobody's asked for Emacs tutorialship yet. That's fine. Again, I love Emacs. I use it. I don't often recommend it. But if anybody was curious about that, I would be very open to the idea.

Sacha: All right, so if people want to also develop a very interesting elfeed setup, they know who to talk to.

Ben: Please, I would love that conversation.

Sacha: Thank you so much. Yes, go ahead.

58:02 A local instance of public-inbox can let you use Gnus to read mailing lists quickly

Ben: Oh yeah, there's just one last thing I want to mention, and I realize we're right up against time. I use Gnus. I use mu4e for email, but I use Gnus for reading mailing lists. I just wanted to strongly recommend to anybody who is thinking about it... This is amazing. You gotta do this. public-inbox lets you keep a complete local archive of the entire mailing list. Searches are instant. Tracking threads is instant. Check it out. It's fantastic.

Sacha: That's great because Emacs-devel has a gazillion threads. How do you even keep track of all this stuff? But if you've got Gnus and if you've got this set up, then you're no longer dependent on the good graces of Gmane being around as an NNTP to mailing list gateway. @JonKishore11 wants to know if you have a YouTube channel. I'm guessing you don't yet.

Ben: I don't really like my face very much.

Sacha: Ping Ben on Mastodon and ask about this mentoring thing and then share your notes so we can all learn from it. Thank you so much for today. I look forward to chatting with you more through toots. What is the verb, you know, in the fediverse? All right. Thank you so much.

Sacha:

Chat

  • sachactube: ​​only slightly panicking behind the scenes 🙂 Nudged Ben by Mastodon in case we got our wires crossed
  • sachactube: ​​yay, he's here, just getting sound sorted
  • symbiopoyesis: Good morning
  • x_goose_x: ​​hey gnomonnnnnn
  • CharlieBaker707: ​yay! love the split keyboard. recently bought one myself. i was getting shoulder and neck pain from so many hours keeping by hands close together, but the split let's my shoulder's relax.
  • ShaeErisson: ​How do you make a capture template to stay on-agenda and record decisions? Any tips?
  • PuercoPop: ​​Regarding terminal emacs, did they need to adapt any keybindings to avoid clashses with the terminal keybindings?
  • AyanRaza-n1x: ​​is that the creator of emacs?
  • Ray-On-Emacs: ​Yes! Google steals C-S-k, which I use to kill tabs to the right on Vivaldi!
  • CharlieBaker707: ​elfeed is like a distraction alleviation machine. I agree with Ben, I don't think I could consume any of this information outside of Emacs. Ads and even varying formats distract me too much.
  • JonKishore11: ​​do he have YT
  • sachactube: ​​Thanks for hanging out, everyone! =)
  • gnomon027: Thanks so much for running this whole series, @sachactube !!
View Org source for this post