[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.
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.
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.
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.
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?
[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.
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.
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.
[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.
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.
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.
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.
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.
[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.
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.
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.
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.
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...
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.
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.
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.
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.
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.
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.
[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.
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.
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.