[Sacha]: Let me do the thing. Go live.
Let's check in.
Alright, hello.
This is Emacs Chat 21 coming back after a decade of not
doing it, so…
And today I've got Amin Bandali who's a…
Is it seven years now that we've been doing
EmacsConf together?
[Amin]: I think so.
Since fall 2019.
Yeah.
[Sacha]: Yeah, yeah, yeah, yeah.
But of course you also do a whole lot of other things.
I was looking through your Emacs configuration and
there's like translation and other stuff in there.
So would you like to start off with a brief
introduction of who you are
and how and why you use Emacs?
[Amin]: Yeah, sure.
Yeah, first of all, hello, everyone.
Sorry if I'm looking to the side.
This is a new setup.
My laptop, which has my webcam, is there, but my main
display is here.
So I might be looking to the side from time to time.
But yeah, that aside, hello.
Yeah, I'm Amin Bandali.
I've been, I think, using Emacs since 2014 or 15, so I
guess more than a decade now.
I'm a software engineer by day, or software developer,
slash programmer, slash computing scientist.
I'm also a free software activist.
I volunteer on a lot of free software projects as
well, which Sacha mentioned.
I do things around GNU.
I volunteer with FSF.
I'm a Debian Developer, so I try to maintain some
packages in Debian.
I try to help run EmacsConf from time to time.
Hopefully this year I will be much more present.
But yeah, that's that.
So I first got into using Emacs, I guess, as a
programmer tool, like as a text editor.
But I've since then kind of integrated it into a lot
of other aspects of my life.
And I do much more with it, as I'm sure a lot of us do.
Yeah, so I use it for kind of note-taking, just any
writing, editing purposes
in multiple natural and programming languages.
Reading and sending email for chatting via IRC.
All of that good stuff.
[Sacha]: This is the sort of thing that isn't
immediately obvious from your configuration.
I know you've got your Gnus setup in there and you've
got your ERC setup in there, but sometimes when
newcomers are trying to figure out, okay, there are
all these packages, but how do I use them
to get stuff done?
That's one of the reasons why we want to do this Emacs
chat, so that maybe you can show us
some of the cool stuff.
We are live, but if you accidentally show something
personal, let me know and I can kill the stream within
10 seconds and I think then we can be like, okay,
we'll just flush that out and then come back once
we've hidden the top secret plans for taking over the
world, that sort of thing.
Sounds good.
Where do we want to start?
[Amin]: I'm happy to do it however you like.
I can either share my screen, pull up my configuration.
Yeah, okay, so let's do that.
[Sacha]: Yeah.
If you share your screen sometimes, I think what we
did ages ago was we just started walking through the
configuration and then sometimes people say, oh yeah,
that's really interesting.
Let's go and demonstrate that so that people can get a
sense of how this actually works.
And there were some things in your configuration that
I had no idea, like what is FFS?
There's like no package.
I couldn't find any information about it.
But yeah, so your config, if you want to go ahead and
share your screen while I
Fill the air with hand-waving.
Amin's config tends to be more on the minimalist side.
I think you mostly rely on built-in things with a
couple of external packages.
You don't even use use-package at all.
It's all run-at-idle-time to delay the startup of
various things, and then it's all vanilla Emacs as you
can get for loading and configuring things.
[Amin]: Yeah, pretty much, yeah.
Yeah, so before I continue, quick note, Sacha, if you
can make me presenter because I don't have access to
share my screen.
[Sacha]: Oh, that would be important, yes.
Hang on a second.
Let me see.
Okay, here we go.
Make presenter.
I might as well promote you to moderator while we're
at it.
There you go.
You should now have magic powers.
[Amin]: Thanks.
Let's see.
[Sacha]: It's a good thing we're practicing this
before EmacsConf so I remember how all this stuff works.
[Amin]: Yep, for sure.
Okay, let's see.
I think I got it now.
Can you see my screen?
[Sacha]: Yes, I can see your screen.
[Amin]: Okay, excellent.
Let's see.
Okay.
Yeah, so as Sacha mentioned at the moment, my config
is kind of very minimalist and kind of conservative by
design, in part because I tend to work on a lot of
different machines, whether it's for work or
volunteering or whatever, and I prefer to use Emacs
if I can.
So I want my config to be fairly self-contained so I
can easily either git clone or rsync it over.
Yeah.
To keep it simple, I was using package.el for a while
for installing and managing my packages, which I don't
keep in my configs repository.
But then I decided to switch over to very manual
package management with the awesome new feature
user-lisp-directory of the next upcoming Emacs release,
which basically you can give it a subdirectory in your
~/.emacs.d or ~/.config/emacs.
And then it'll go through all the Emacs Lisp files
recursively, byte compile them, native compile them,
all that good stuff, and add them to the load-path.
And for people who are using existing or older
releases of Emacs, there's also site-lisp by Philip
Kaludercic, which is kind of the…
I guess first implementation of what later became
User Lisp and built into Emacs.
So you can make it conditional and fall back to
site-lisp if you want to be able to use User Lisp on
older Emacs but still have your configuration be
usable.
Yeah, anyway.
So I've experimented with like a couple different ways
of managing my configurations like single giant init
file of like four or five thousand lines which I know
is actually not very large by comparison to I think
like someone like Sacha's configuration and also like
You know, split into multiple different files, which
has its own benefits.
And I've kind of actually converged to the approach
that Prot uses.
If you actually take a look at my configuration file,
you see I've drawn a lot of inspiration from Prot
switches.
Having a literate single file configuration, which
then all of the Emacs Lisp source blocks get tangled
to individual files.
So I can maintain a single source of truth and edit it
all in one place, but then also easily be able to
share individual pieces to people if they want.
So yeah, that's kind of the general approach.
And I can dive right in.
[Sacha]: Yeah, that's definitely the structure that
I've also stolen from Prot.
And I like the way that you're
Your heading names are all long and descriptive, and
you've got everything broken down in detail.
So yeah, go ahead and walk us through it, please.
[Amin]: Yeah, sure.
Let's see.
So that's a brief introduction, and then I have an
early init section for doing the early init file.
There's a couple of subheadings here.
Actually, let me enlarge the font size a little bit to
make it more legible.
OK, great.
I do a couple of things here like disabling package at
startup because I don't use package as I mentioned.
I manually install and update my packages as git
submodules in my configurations repository.
I set load-prefer-newer to t to make sure that I
never load any stale code.
For example, I might edit some Emacs Lisp file by hand
and forget to byte compile or native compile it.
And this tells Emacs to basically just use the version
of these three variants that's the most recent.
Yeah.
Nothing super fancy here.
I turn off a couple of things that I find a little bit
distracting, like the menu bar or toolbar.
Although I do say here that for people who are new to
Emacs, they're actually super helpful.
Sure, it's a little bit of visual clutter, but in the
beginning, it's really, really helpful to help you
orient yourself of what mode you're in, what tools do
you have available in your disposal.
And even someone who's been using Emacs for more than
10 years, I also use it sometimes when I'm like…
just starting to use a new mode.
So yeah, good stuff.
[Sacha]: I was very amused by the comment on the…
"I don't like getting jumpscared out of my chair."
You turned off the bell.
[Amin]: Yeah, because that actually used to happen
when I first started using Emacs.
Like when I would, I don't know, I don't even remember
when it bells or rings, but
Maybe if you like quit like with C-g or like try to
backspace into like delete where there's no more
characters to delete so it rings a bell and it's very
like can be jarring so yeah I turn that off.
[Sacha]: Yeah, and then you've got a whole bunch of
things where you set some variables to nil temporarily
to make it faster, so that's in your startup in garbage
collection.
[Amin]: Exactly.
Empirically, there is no hard and fast science
behind this.
I experimented over the years.
I'm pretty sure I believe the default, for example,
the garbage collection cons threshold is about eight
megabytes.
I tried increasing that a little bit to see how much
If I increase it to what point
will it make my startup faster?
And I found this 30 megabytes or mibibytes to be
kind of a sweet spot.
So I bump that up.
And then after Emacs has finished initializing, in the
after-init-hook, I just restore the defaults.
And then, yeah, this is the bit with
the user-lisp-directory that I was talking about.
Awesome stuff.
So you can basically designate a directory.
For example, in my configuration,
it's just a lisp directory.
And then on startup, Emacs will go through and
byte-compile, native-compile if necessary, and then add all
of that stuff to the load-path automatically.
So you get that.
Yeah, and then this is the bit about site-lisp that I
was talking about.
So if you want to use user-lisp, but you're still
using older Emacs versions that you maintain, you need
to maintain backward compatibility in your config.
This is how you do it, for example.
So you just yeah, add it to load-path, require it and
then call prepare-user-lisp.
That's about it.
[Sacha]: I'm picking up that tip about using the
ignore directories.
I'm getting by with just ignoring all of the byte
compilation output, but it would be nice to just say,
you know, that stuff is test.
I don't need to worry about it.
[Amin]: Right, right. Thanks. Yeah, I was also doing
that.
I actually have it as a comment to suppress
warning types, like byte compilation, but I was…
I plan on working on some packages,
whether my own or others,
and it would still be helpful to get those warnings,
so I keep them enabled. It's still a bit annoying.
I still get some of them when I launch emacs
but I don't restart or launch emacs as frequently
so it's pretty bearable.
Yeah, and then I have the main init file.
And there's not much in it.
It's just the debug-on-error and debug-on-quit.
So the debug-on-error thing, I set it to the value of
init-file-debug.
And if you look at that, the help for this variable,
basically if you pass or launch Emacs with
--debug-init, this variable will be true.
So yeah.
[Sacha]: I did not know that.
Cool.
[Amin]: Yeah, it's pretty helpful.
I think, if I'm not mistaken, I took this from
John Wiegley's dotemacs, but I can't remember for sure.
It's been years.
Yeah, it's pretty nice.
And then here, I just set my name and email address.
And very early I set a custom-file to keep all of that
stuff separate from my .emacs.
I don't want it mixing in.
And then pretty much the only other thing that's in my
main init file is just to require and load these
different modules or packages of my configuration.
I have these as actual packages or as actual features.
They provide themselves.
And that's just something that I've found
straightforward enough to do.
I know, for example, Prot uses a dual approach.
He has some of his configuration that's more readily
usable, available as actual packages.
And then the other ones, it's just Emacs Lisp code.
It's not actual packages.
But for me, I just keep it simple.
Everything as packages and that's about that.
[Sacha]: Fantastic.
Let's dive into some of those configuration modules.
[Amin]: Sure, let's see.
Yeah, so this there's this like core thing which is
kind of included gets included in all of my other
files.
I wrote a bandali-configure macro
shamelessly based on prot-emacs-configure which
is what Prot uses and it basically is a way of kind of
similar to use-package for like wrapping a bunch of
relevant like Emacs Lisp code all together.
It has the benefit, if you use it, if there is an
error in that block or in the body basically, then it
won't crash everything.
That body will just get ignored and we display an
error.
And that's also the main reason that Prot uses it.
The one thing that I added extra to mine, which I took
with inspiration from Eshel Yaron's esy/init-step,
is to wrap it up in basically time the execution
of each of these blocks, which can be pretty helpful
to help you see, okay, which part of my configuration
is particularly slow.
Usage examples.
I just have it here.
You can either basically pass it like a symbol like
thing or you can also pass in a string as the first
argument.
And this is what will be displayed when you display a
list of the evaluation times for all of these
blocks in your configuration.
Yeah, and then I have a neat little function
here like bandali-configure-report-times
that will report these times,
whether in the order that it's
encountered them, or you can have it
sort by fastest to slowest,
slowest to fastest, blah blah blah.
[Sacha]: You mentioned you're no longer using this.
Is it because you wanted it to be easier to
copy and paste your code?
What got you to shift back to the regular vanilla type
of configuration?
[Amin]: Right, as neat as it is, I didn't find it
super useful. For one thing, because I don't add or
remove a ton of stuff to my Emacs configuration
regularly, so if there is an error, it wouldn't cause
an issue for the rest of my configuration. I didn't
really find that very useful.
And then my other potential concern is that the way I
was structuring things, I would put all of the
configuration, let's say for Gnus, in one of these
blocks.
But I wanted to be able to break that down into, for
example, Org Mode sections more easily.
So far, I just decided to not use it.
I know I could technically break those down into
smaller blocks, but I haven't done that yet.
[Sacha]: Ihor says, this configure macro looks a lot
like good old use-package, which you're not even using
in the rest of your config.
And I hear you about wanting to be able to split
things into smaller blocks with more explanations in
between them.
So in my config, yeah, sure, I've got the use-package
there to do the ensure and all that stuff.
But I also have with-eval-after-load because I still
want, you know, the links and the screenshots in
between.
[Amin]: Right. Yeah, exactly. use-package is awesome.
I have used that in the past,
especially when I was using the straight.el
package manager. It pairs nicely with it. But yeah,
since then, I found it a little bit like too magical
for my tastes, kind of along the lines of
declaring an init file bankruptcy at some point I
really wanted to
understand every single line that I have in my Emacs
configuration.
And at the time, I didn't know a whole lot about
macros or wasn't very well-versed with them.
So I just ditched it in favor of simply using, as you
mentioned, with-eval-after-load.
And then that causes all that code to be basically
delayed, not evaluated immediately, but when that
package is loaded.
And then as to when to pull that package in, depending
on if I want it right from the get-go of my Emacs
start, then I would require it.
Otherwise, I add this, as you also mentioned earlier,
this kind of timer thing where if Emacs is idle for, I
don't know, 0.2 seconds or 0.4 seconds, then go ahead
and require this package.
[Sacha]: Ihor has a tip in the chat.
Of course, Ihor has an Org way to do this.
He uses use-package whatever config and then he has a
noweb reference to the Babel blocks.
Then he just says :tangle no on the source blocks so
that they don't actually get repeated.
Anyway, you can look at it later when you go through.
I'll send you the comments or whatever.
But show us how you're actually configuring things
since you're not using this.
[Amin]: Then I just have another
quick macro thingy here, bandali-define-keys, which
wraps around Emacs's define-key. It affords me the
convenience of defining multiple key bindings, and
Prot's version of this (I think it's
prot-emacs-keybind, or something like that) he
imposes the limitation that the keys should be valid
strings that can be passed to the kbd function,
which is very fair and valid, but I wanted to not
impose that, to keep the flexibility of using
define-key directly.
The consequences of that, as we can see, is we can
pass in the old representation of key bindings, like
the vector or whatever syntax, which Prot's doesn't
support by choice, whereas mine does.
Let's see.
For example, let's look at the bandali-theme.el, which is
all about…
The appearance, I guess, of Emacs.
Yeah, so I just have a conditional block where, you
know, if you're in a graphical environment, I'll just
go ahead and load Prot's doric-themes, specifically
doric-oak, which is what we're seeing right now.
I'm using, it's very beautiful, it's very subtle, and
it uses emphasis, bolding and stuff to draw
your eye to something instead of using a million
different colours, which I find pretty nice.
Yeah, and then for example here I set up some fonts.
I use this Sahel font for Persian and Arabic
text.
I set a colour emoji font here and this is like we get
a kind of preview of what I do.
It's like with-eval-after-load 'faces and then blah
blah blah.
[Sacha]: Ihor would like to point out that
with-eval-after-load is also a macro
that calls another macro.
So I'm just going to mention it because it's there.
These are your fonts.
This is your theme.
This is great because everyone always asks, what theme
is this?
What font is this?
All right.
I like your text scaling tweaks that you're just about
to go into. You've changed the global mappings.
[Amin]: Yeah, yeah, yeah.
And I actually took this from Prot as well.
And it makes a lot more sense.
So by default, this, C-x C-+, -,
blah, blah, blah, it only scales the text
for the current buffer only.
But in newer versions of Emacs, in Emacs 29, they also
added commands to adjust this globally, including
the mode line and all that stuff,
which is usually what I want,
for example, in this presentation or when I'm sharing
my screen right now.
It scales everything up globally.
So yeah, I just swapped these to be the default, and
then I add keybinds for the just local variants in
case I need to use that.
Yep.
And then here I have display-fill-column-indicator.
I don't know, maybe this is just me, but sometimes I'm
kind of OCD about keeping my text lined up at exactly,
for example, the 70 characters column.
I care a lot about that, especially if I'm writing
code or text that I want to also visually look nice.
And I enable this.
And let's see, I enable it for prog-mode.
So yeah, I guess if I, for example, do this…
This little thin line that we see here, that's the
display filler column indicator.
I used to have it globally enabled, but then I found
that a bit too much, so I just enable it with a hook
in the modes that I want.
[Sacha]: Yeah, and the theme makes it very subtle.
It's just there as a reminder,
don't go beyond this line.
You can if you really want to, but just try not to.
[Amin]: Yeah, exactly. And then my essentials…
This is where I configure a lot of key
behaviours of Emacs, all built-in stuff for the most
part, or things that are key to my workflows.
For example, I always want to start with a *scratch​*
buffer.
Start the Emacs server if it's not running.
And this is very useful, very helpful so that then you
can call into an existing Emacs process with
emacsclient and have it edit a file.
I don't use it for anything fancy just yet.
I believe Prot also mentioned in his video with you,
Sacha, that he uses it for things like org-capture to
spawn a new buffer in his existing Emacs session
and things like that.
You can do pretty cool things with it.
But yeah, I just use it for being able to easily use
my Emacs as EDITOR and VISUAL text editors.
So yeah, this sets that up.
Adding a fundamental mode hook.
Again, I took this from Prot.
[Sacha]: I was surprised by that because I was like,
oh, there isn't a fundamental-mode-hook?
Okay, that makes sense now.
[Amin]: Right, right.
Yeah, there isn't a fundamental-mode-hook by design.
But I still, in the past, have found that I wanted
that.
For example, for this display-fill-column-indicator,
when I had it enabled everywhere, I was like, it would
be nice if I could at least disable it for Fundamental
mode.
And at the time, I didn't have this.
I added this just recently.
So if I decide to go back to using something globally,
but I don't want it in fundamental-mode, then I can
disable it using this.
Yeah, and then some standard stuff like I prefer
spaces and a tab width of four characters.
Visually indicate buffer boundaries.
This is a little bit hard to see right now,
but here at the bottom left
you see a little down arrow
and then the little top arrow.
And… Let's see if I can.
[Sacha]: Oh!
[Amin]: And also here, for example, when it all fits
in the view.
[Sacha]: Huh, that is cool.
I was looking at that.
What does it do?
And so that tells you, you can still scroll up or you
can still scroll down, and you don't have to look at
the scroll bar to see where you are.
It just says there's more there.
[Amin]: Yeah, exactly.
Yeah.
And it also helps distinguish when there's a newline
character at the end of the file or not.
So here in this buffer, there is.
But if I delete that, you see this indicator here
changed shape.
But if I go back and add the new line again.
So yeah, that's also been very helpful for me because
I added configuration files and some of these pieces
of software are sensitive to having a new line at the
end of the file.
So yeah, it's very helpful and useful for that.
[Sacha]: I would not have guessed that from the very
short line in your config that turns that on.
It's one line, (setq-default
indicate-buffer-boundaries 'left), and yet it adds this nice little
nuance to the way that fringe looks.
[Amin]: Right.
Yeah, absolutely.
Perhaps I should expand more on it at some point later
to explain these things.
But yeah, just this one line.
[Sacha]: May I recommend screenshots?
[Amin]: Yes, you may, for sure. Yeah, I will
definitely do that as well,
because I'm also a bit of a visual person.
I like seeing screenshots and videos,
so yeah I'll take that to heart
and do that for my own configuration as well.
[Sacha]: When I post this, I'll probably… I figured
out how to have the transcripts and then screenshots
embedded into my transcript.
I'll generate it automatically from the subtitle file.
Our EmacsConf transcripts are going to get so fancy
next year. But you can pull those screenshots
and drop them into your config. It'll be great.
[Amin]: Nice. Yeah, for sure. Sounds good.
And then here, I just enable some of these
commands that are disabled by default.
So yeah, it's useful, especially narrow-to-page,
for example, or narrow-to-region.
These are commands where Emacs disables them
by default so that newcomers
don't accidentally hit them and get very
confused by what just happened.
It doesn't disable them for good.
It just basically prompts you for confirmation.
Are you sure you want to run this command?
I'm sure, at least about these commands.
So I just enable them.
And then something like, for example, overwrite-mode,
which I never use
and I don't want to accidentally enable.
I just put it disabled so that if I do accidentally
hit the keys, which might be, I don't know, something
insert or whatever, then it will prompt me
to make sure that I meant to do that.
[Sacha]: That reminds me, I should probably turn that
off for myself and then you get a whole new keyboard
shortcut you can use too.
[Amin]: Right, yeah.
Let's see.
Yeah, I have just one line setting for package.el.
In Emacs 31, we will be getting a package-review-policy
which is very helpful.
So if you do use package.el for installing packages
from GNU ELPA, NonGNU ELPA, MELPA or whatever else,
you can enable this, and then whenever you update your
packages, you'll get a diff of what changed in this
new revision of the package that you're downloading
and you're about to enable.
And you can presumably say yes or
at least see what's going on, which I'd find helpful.
[Sacha]: But you're not using packages, you mentioned,
so you're just checking everything out and then you're
just git pulling whenever you feel like it.
[Amin]: Yeah, so right now I'm using git pulls and git
submodules, very manual.
I put this here because I think it's generally a very
welcome change and awesome new feature that I want to
spread the word about.
So maybe someone who's looking at my config, they use
package and that's perfectly fine.
So this is just here to spread the word about it
mainly, I guess.
And if I start using package at some point myself in
the future, then I will have this enabled.
Let's see.
Very quickly, here I extend Info-directory-list.
I like to, at least on some of my machines,
use Emacs that I built from source directly in the
source repository of Emacs.
Just after doing make, I don't run make install,
even though it's very easy to do that.
You can install to a custom location by providing
--prefix when you're ./configure-ing Emacs.
Sometimes I just find it more convenient for me to not
do that and just run make and then exit and reopen
Emacs.
And for that kind of a setup, I just extend the
Info-directory-list to include the info subdirectory of the
Emacs source repository so that the built-in Emacs
info manuals will be available to me.
And then I use recentf
for tracking recent revisited files.
I bind it to C-c f r e
for me to get a pop-up completion for visiting a
recent file, it has completion.
So if I hit TAB here, for example, we can see some of
these files or directories that I visited recently.
[Sacha]: I see.
And then you're adding the directory to it.
So what does that let you do?
Because I'm assuming you're already in there in the
directory.
But how does that change your recentf?
[Amin]: Right. So I need to think to remember this,
but I think the point of this was that if I
open a project in VC or in Dired, then I
would like that directory to also get added to my
recentf files list, because I think by default,
recentf only includes files, not directories.
[Sacha]: You're in it, you start up Magit or whatever,
and then you move on to something else, but you want
to be able to easily go back to it.
[Amin]: Yeah, for example, I like to keep my recently
visited directories in recentf as well.
Because that's one of the main ways I jump between
projects and stuff, even though there is literally a
built-in Emacs project mode, which I still use.
The only thing that I have here is…
I don't want to add my home directory to the recently
visited list, so the only thing that this function
does is to skip that if I'm opening the home directory.
That's about it.
And then here I configure mouse and scrolling behaviour.
So I want Emacs to scroll very gently, one line at a
time.
I think the default is that when you reach the end of
the page, it'll jump half a page down and then
recenter.
I don't remember default behaviour because I don't use
it very much, but yeah, this basically makes it
very predictable. For example, when I reach
the edge of the page here and I press C-n,
it'll only scroll one line at a time, instead of
jumping and then doing something like
this.
[Sacha]: Oh yeah, mine does! Mine doesn't do that, so
it does that jumping thing. I see what you mean
here. Interesting.
[Amin]: Yeah, so you can tweak that with scroll-conservatively
and then scroll-preserve-screen-position, I believe.
Yeah, and then I use autorevert, which is pretty
helpful.
So this will have Emacs watch, for example, files that
are open in your buffers.
And if they change on disk, Emacs will automatically
refresh the buffer so that you get the latest version.
The cool thing is you can press undo in one of these
files that's been autoreverted so that you get the
revision that was there right before the change.
So I've used that sometimes as well.
[Sacha]: Yeah, and sometimes autofollow also is nice
for log files and things like that.
But yeah, autoreverting is great.
[Amin]: Yeah, for sure.
repeat-mode is something that I've only recently
started using, especially with my Emacs EXWM setup,
using Emacs as my window manager.
For example, if I hit C-x o, we see here in the
echo area where it says repeat with o or capital O. So
I can now only press o instead of saying C-x o,
C-x o to do that multiple times.
Keymaps that have support for this basically indicate
that they want to be repeatable can declare that.
And then once you invoke one of the keys in those
keymaps, then you can repeat it with just that single
character.
And for example, for my setup, I have that with my
EXWM workspace switching keys.
So I can easily go to the next and previous
workspaces, many of them at a time by just pressing p
and n instead of doing the shortcut multiple times.
[Sacha]: And actually, if you don't mind jumping
ahead, the EXWM part of your config is fairly complex,
and I think not a lot of people have a lot of
experience seeing EXWM in action.
And I don't know whether you're comfortable sharing
you switching around to different workspaces, but if
that is something that you can do, how are you doing
all this awesomeness?
I'm still too scared to use EXWM myself.
Stability.
But that's a me problem, not an EXWM problem.
[Amin]: Yeah, EXWM was pretty awesome.
I used it back in 2018, '19 for a while, and then I
kind of moved on to Sway and Wayland.
But I don't know.
It's something that I feel like once you try it, you
want to keep going back to it.
So recently, this past month or so, I decided to give
it an earnest try and try to actually address any pain
points that I've noticed.
So it's much more usable for me now, and I'm sticking
with it for now.
I'm not a Wayland hater, but I'm just saying, at least
for now, I'm using EXWM.
And I'm happy to talk about it.
[Sacha]: OK, what do you love about your setup for
that one?
[Amin]: EXWM?
[Sacha]: Yeah, yeah.
Like, you're doing a lot of rename buffers.
Yeah, yeah, yeah.
[Amin]: Right.
Yeah, let me think.
There's a couple of things.
So, for the longest time, my Emacs EXWM configuration
used super key as a prefix,
which is the Windows [key] or the one with the
logo, basically, to switch workspaces, launch
applications and such.
And at least the way that EXWM is right now, it
doesn't…
Like the way you have to add those global key bindings
kind of slows down the EXWM startup.
And I had many such key bindings.
So one thing that I did kind of recently is to
define a prefix map here, like bandali-prefix-exwm-map.
So I bind all of the keys and commands that I want
here, and then this helps me really minimize what I'm
telling EXWM, which is here.
For example, this is how you set global keys with
EXWM, and I just point it to my prefix map.
C-c x and then any of those letters and
functions that we saw.
That's kind of annoying.
I still use the super key here, but I have it s-x
and s-,.
On the left-hand side of my keyboard, x is right next
to super, so I can hit it in one go with one motion
almost as a single key with these two fingers.
On the right side of my keyboard,
I don't have a super key,
but I have a control key that I remapped to super.
On the right side, I do s-, with these two
fingers.
It's still very convenient for me to invoke those
commands.
And pairing this up with repeat-mode, as we can see
just here, actually, then I can hit s-, and
then p, n, or h, j, k, l many times to switch
workspaces or shift focus to different windows and
stuff without having to hit that kind of annoying
s-x or s-, repeatedly.
Yeah.
[Sacha]: That sounds really cool.
I should look into that.
Sorry, quick aside.
@blaiseutube would like to compliment you on your awesome
audio setup.
It sounds like you're in the room with him.
Apparently, I sound like I'm on speakerphone, but your
audio setup is top-notch, apparently.
But that looks like a Blue Yeti, so I have to find out
what's going on.
What microphone are you using?
[Amin]: It is indeed a Blue Yeti.
[Sacha]: Yeah, yeah.
So I just have to ask him for
okay, what kind of boom mic?
Anyway, we'll do that all offline because it's not
Emacs related.
[Amin]: Yeah, it's just the Blue Yeti.
Yeah, I turned down the gain.
I used to have gain higher, but then it picks up
more noise from around the room or around
the house.
So I turned down the gain a lot and then I get
close to the mic so that it only captures my voice.
Okay.
[Sacha]: I'm gonna need the boom.
Otherwise, I'm squished into that corner.
All right.
So you were doing repeat-map before I said oh,
let's talk about EXWM because you've got cool stuff
there.
[Amin]: Yeah, and I can continue talking about the EXWM.
There's a lot here.
I have, let's see, s-, SPC.
I bind it to async-shell-command to use as my
simple, little, dmenu-thing for
launching applications.
Some of these things, like browsers, I still
do them frequently enough, and I use different
browser profiles.
So I just define a new keymap so I can basically one-shot
launch Chromium or Firefox in a specific browser [profile] or an
incognito window and such.
So yeah, I just do s-x b and then, for example, c
to launch Chromium and all that stuff.
So I found this pretty convenient.
Speaking of key bindings, before I get down this,
let's see if I can find… C-c h.
I think this is just before my EXWM setup.
I'm pretty proud of this.
I love this.
It really goes to show how awesome Emacs is and
extensible it is.
Let's see.
So as we know, these various help commands and
describe commands are under C-h prefix.
But some of them are not bound,
for example, find-library or describe-face.
Some of these I use pretty frequently.
I was really having trouble coming up with
descriptive-enough keybindings
or short-enough keybindings for all of them.
I put some of them here, for example, like
C-c f l for find-library.
But I can't do that for all of them.
What I did was just do C-c h a or C-c h d.
What this will do is basically, if I show that,
It basically opens up M-x, fills in describe-,
and then I can just type, for example, face,
and that's it.
So it basically opens up the minibuffer for me,
pre-fills it with the string that I want, and I can
type what is it that I'm looking for.
And I found this to be
better than trying to bind a million different
keyboard things for describe this and that,
apropos this and that, find this and that.
So yeah and the way that we do that is to just use
a minibuffer-with-setup-hook, and you just have a
little lambda to insert the string that you give
it, and then you invoke it.
[Sacha]: Yeah, this is pretty cool.
When I saw that in your config, I was like,
I'm going to steal that.
Pre-filling the minibuffer
but still letting you do stuff with it,
it's such a powerful thing, not just for
completing the command itself, but even for when
you're using the command,
but you want to do something with the input before.
You don't want to do it all the way,
send it in and submit right away.
You want to actually do something with it after you
insert it.
So great tip.
[Amin]: Yeah.
Thanks.
Yeah, it's pretty useful.
It's pretty nice.
Yeah.
And then back to the Emacs or EXWM stuff.
So before I had, I used to yeah, sorry, go ahead.
[Sacha]: Sorry.
I forgot whether I was muted or unmuted.
[Amin]: Okay, no worries.
For the longest time, I had 10 default
EXWM workspaces on startup, and that can slow
things down a little bit.
So I found that okay, I don't really use
all 10 workspaces always.
So I set it to 5.
So I get five workspaces initially.
But I still bind keys here.
Like if we go down.
Let's see.
Here.
So here, I define those keys for all the way from,
let's say, from 0 to 9 for all 10.
And then if I try to switch to a workspace that
doesn't exist, then EXWM will just go ahead and
create it for me.
Yeah, so I found that pretty cool.
You can create workspaces on the fly.
Yeah.
[Sacha]: Yeah, and I saw that it moves your current
window there, too.
So that's just like, OK.
Let's move it to workspace number two or whatever.
Very cool.
[Amin]: Yeah, yeah, yeah.
I have keys or convenience keys for moving
some window to some workspace.
Yeah, it's nice.
Let's see.
Yeah.
So these are just made key bindings.
I use hjkl here for switching windows.
I also have a ZSA Voyager split
ergonomic keyboard.
I can basically customize it infinitely.
For example, I don't really have a super key on the
first layer.
What I have is a key that will do the s-x thingy,
basically, my prefix.
So that's the last missing piece is that if I'm
at home and if I have this keyboard with me, then I
just hit one key and then that's it.
I'm in my prefix.
But even if not, on the laptop, the s-x or the
super comma are still easy enough for me to hit
it with one hand.
[Sacha]: Now I'm jealous and I definitely want
to assign my prefixes to their own keys.
Very tempting.
I've started using the numpad because my laptop has
one.
I only use the numpad rarely, but we all need more
keys.
[Amin]: Yeah, ergonomic keyboards are pretty nice,
especially these ones. For example, the ZSA ones where
you can put QMK on it, the QMK firmware. You can
define keys in a C file. I can actually show that.
Let's see… QMK Firmware, Keyboards, ZSA,
Voyager, Bandali, and then keymap.c.
[Sacha]: Is this in your repository somewhere?
[Amin]: Right. It's in a different repository, but it's
still on https://git.kelar.org next to my configs
repository. You can find this as well, but if I go
smaller…
Yeah, you can define keys here and have different
layers, like the base layer.
And then you can define a key to switch between
different layers and put some of the keys there anyway.
So yeah, it's a whole rabbit hole in and of itself.
Prot also uses a split ergonomic keyboard.
It really does help if you're typing for long
periods of time.
I actually had these for a while, and I wasn't using
them too much, but I started slowly getting some pain
in my wrists and here.
So I was like, okay, I have the keyboard,
might as well put it to good use, and I've started
using it.
[Sacha]: Okay, so most of your keyboard shortcuts come
off that kind of s-x or C-c something, and
then you have a long prefix sequence, and you just
remember everything or you use your…
pre-fill some of it and then fill in the rest of the
command.
[Amin]: Pretty much all my window management related
keys are on this s-x prefix that I'm showing here.
And then I have a few other ones which I think I
showed earlier.
Is it this one?
Anyway, I bind a few general keys outside of the
s-x thing, like C-c e i.
For example, I have C-c e e for eval-last-sexp.
I do that a lot, so it's easy to hit that.
Making frames or deleting frames.
[Sacha]: I love how Emacs uptime is something you use
frequently enough that you have a keyboard shortcut for it.
[Amin]: Yeah, of course.
I mean, I'm sometimes curious to see how long has my
Emacs session been running.
To continue with the EXWM stuff, let's see.
This is just some keybindings I define here.
It's all Emacs Lisp, right?
It's amazing.
You can mapc over whatever sequence and create
keybindings like that.
Only with Emacs we can do things like that.
I just love it.
Let's see.
I still keep these three other keys for raising and
lowering the volume and toggling mute off of that
prefix and just directly on my keyboard, hitting it
directly in the exwm-input-global-keys because I do
that very, very frequently.
But I also have scripts that I can invoke.
I should do keycast.
So yeah, I can
invoke the prefix with semicolon.
I can set my volume here, adjust it here, type in what
volume I want, or with the single quote, I can enter a
value for the screen brightness.
I like these things to be exact depending on the
lighting in the room.
I have preferred brightness values of 50 or 12 or 10
that I manually adjust.
I guess it's a poor man's version of having something
with a light sensor that can pick up and adjust
automatically.
I do it manually.
Yeah.
Sorry, you just muted yourself again.
[Sacha]: You're just probably this close to writing
the Emacs Lisp that takes your webcam image and then
adjusts your light.
But I think Prot was also saying he likes to do the
lighting changes manually as well because warmer
colors versus cooler colors and all of that stuff.
Anyway, so you have all these buttons that EXWM
listens to and it can launch various things for.
That's a lot of things.
[Amin]: Yeah, those are pretty cool.
EXWM has this lovely feature called input
simulation keys where
You can basically use it to bring Emacs key bindings
to other applications like Firefox or whatever.
And yeah, it's mind blowing when you try it for the
first time.
for example, I bind C-b to just hit
the left arrow on the keyboard.
And it does that.
So I can define all of these commands that I'm using
or used to using in Emacs.
So I can get them in Firefox or other applications as
well.
Realistically, it's mostly Firefox.
It's the only other program that I spend any
reasonable amount of time outside of Emacs.
[Sacha]: Let me point out this very important one that
you have there.
Under selection/cut/copy/paste, I see a C-w
input simulation key.
So this is for all the people who have accidentally
closed their browser tab while trying to copy text.
This is how you solve that problem.
Use EXWM and use EXWM input simulation keys and you
don't have to accidentally close your browser tabs
again.
@blaiseutube asks, hey, what about time since last save?
Or do you have some kind of autosave magic?
you know, in reference to the uptime thing,
right?
You have this thing that shows you…
[Amin]: I don't think I have anything for autosave,
but I have this habit of… I save everything pretty
regularly.
Yeah, so I've never really needed that feature, but
I'm sure Emacs has something where you can, at the
very least, just very dumb, simple implementation of
has it been idle for one minute, then just do a save
buffer.
You can roll your own.
But I don't have anything.
[Sacha]: All right.
I'm getting really tempted now to try out EXWM, even
if it's just for those global keyboard remapping
things.
How is it for windows that you've got to have floating?
I feel like it's very good at handling tiling things,
but how is it for sometimes the apps kind of really
want the floating window?
[Amin]: Right, yeah, so you can toggle any window to
be floating or not, and you can also - actually, we're
just looking at it here. EXWM manage configurations,
to match on the instance name or the class name of a
window that you can get from xprop, to automatically
make that tiling. For example, if I do my prefix and
then capital T, it launches a floating terminal for me
here.
And if I go back to where I set it up, I just launch
Xterm with the -name argument.
This is where it can set the instance.
And I just put any string you can want, like floating,
for example.
And then here in my configuration, I just check that
if the instance name is floating, then I'll go ahead
and float the window.
Simple as that.
[Sacha]: All right.
This is starting to look exceedingly tempting.
Lol, I save everything regularly, so he's one of those
people who compulsively hit C-x C-s.
[Amin]: Yeah, I do that a lot.
I don't know.
It's just me.
But, yeah.
Yeah.
And then, I don't know.
EXWM is awesome.
You can also put local simulation keys,
application-specific simulation keys, depending
on, the application, terminals, for
example, or, Zathura.
This is a PDF viewer.
To have application-specific custom key bindings,
how cool is that?
For example, if I'm in Xterm or something like the
Mate terminal, hitting C-c C-c twice basically,
it'll just send the C-c key to the terminal.
Because one thing with EXWM is that you can set it to
capture a couple of Emacs prefixes, like C-x or
C-c.
So the application by default doesn't see it because
Emacs captures it.
But this is one of those
mechanisms by which you can send a key through.
Let's see.
The other thing is, you can set it like EXWM inputs
send next key.
So the default is C-c C-q, but I just
bind it to C-q, and I, for example, can do
C-q C-t to send C-t to the
underlying application.
So that's the other thing.
Yeah, and then let's see.
So this thingy here, I enable EXWM and I add this
rename hook and all it does is basically to add the
window titles to the buffer that I can see on the
mode line.
But as long as it's within a certain
reasonable length, like for example, I have 25
characters.
If it's longer than that, it will just put dot dot dot (...).
So yeah, that's all the purpose of that.
Let's see, for example, if I launch Xterm, it appears
there.
The perfect example is actually here on the right-hand
side.
On the mode line, we see Firefox ESR Emacs Chat.
It's a bit long, so it just puts the dot dot dot there.
So that's all that does.
[Sacha]: Yeah, now being able to use Emacs to manage
the tiling of these things instead of my having to
fiddle with alt-dragging things to snap nicely into
buffers.
Yes, very cool stuff.
EXWM.
Gotta try it.
[Amin]: Yeah, for sure.
Yeah, let's see.
Here I launch Dunst if the executable is
installed for getting notifications in EXWM.
I think there's at least one or two Emacs specific
packages that implement a simple notification
daemon or backend so that Emacs itself can handle
that.
But I found Dunst good enough for my use cases coming
from i3, Sway, like tiling window manager
background.
I just reuse that.
So yeah, I just start a process, keep a handle of it
in this bandali--dunst-process variable here.
And this thing I discovered recently, it's cool.
using set-process-query-on-exit-flag, you
can basically have Emacs not ask you if you want to
exit Emacs if that process is still running.
It'll just kill it without confirming with you.
So just a little convenience.
[Sacha]: That is also cool.
Just a heads up, I have about 15 minutes before the
kiddo runs out because she'll be done with school then.
Even just the EXWM part and other things that you've
shown us in the config have been super awesome.
But are there other things in the next 15 minutes that
you would love to show people so that they can see how
it works in practice?
[Amin]: One thing I'll just mention, EXWM,
one more thing, and then I'll go check.
I think this is kind of recent: EXWM xsettings, and
this allows you to dynamically at runtime change some
of these things that you would normally set in an X
resources file, like fonts. These kinds of settings
were especially commonplace back when Wayland wasn't a
thing or wasn't very popular. You would set some of
these font settings there.
With EXWM xsettings, you can do this dynamically,
and what's awesome about that is it also lets you hook
into, for example, if your screen configuration
changes, if you plug in a monitor or unplug it, then
you can run whatever xrandr command to set it up and
also adjust those settings.
The main thing I use it for is to change the DPI
setting. The thing with X11 or Xorg is, unfortunately,
there's no per-monitor DPI. There's one global DPI.
But I found that on my high-DPI laptop screen, if I
set the resolution to 1920x1080 instead of the full
resolution, then the default DPI of 96 works just fine
with my external monitor as well. All this little hook
does, by calling into this function, is: if I'm
plugging in my external monitor, lower the resolution
and lower the DPI, and if I unplug it, go back to the
high thing. I just love this.
[Sacha]: That's great.
We're definitely not going to demonstrate that because
plugging in and unplugging monitors is not a good
thing for screen sharing, but that sounds really cool.
When things change, you can actually get your system
to adapt to the changes for you.
[Amin]: Yeah, it's lovely.
Let's see.
There's so much more to talk about.
I'm slowly getting back into Org Mode again.
For the longest time, I didn't use it and I just used
Markdown for my website as well.
But I found that it's kind of limited.
For example, I was using a Markdown implementation
that was written in C and I can't easily customize it.
Whereas with Org, I can hook into or create
my custom HTML backend that's a
derivative of ox-html, even if I don't necessarily like
the defaults or the settings for ox-html.
I just recently started writing a new backend called
bhtml for Bandali HTML.
It's just a boilerplate.
I don't have much there yet, but that's the idea.
[Sacha]: I love how you can hook into all of these different
aspects of Emacs and get it to do exactly what you
want.
[Amin]: Yeah, so that's cool.
Let's see.
I have written some things about the prompt for this
meeting.
Yeah, so I talked about that stuff briefly.
Minibuffer setup.
Things that I love about my setup is that it's kind of
portable, simple.
People can easily copy things from it if they want.
It's kind of self-contained.
And that was kind of a big thing a while back when I
wanted to use my configurations on a couple of work
machines.
And these don't have direct outbound internet access.
So I couldn't do things like installing packages with
ELPA because that's done over HTTP.
So yeah, I use submodules now.
I recently began documenting my setup, very much
inspired by Prot and Sacha and others.
The things that I'm looking forward to tweaking next
is the mode line.
This is basically the default mode line of Emacs.
A couple versions ago, they added a setting for
compacting the mode line, which
improves a lot of the extraneous whitespace in it,
which is great.
It's still… There's too much information.
If you use multiple windows
or even especially if you use EXWM
all of those things like the date
or like the battery get repeated
in all of the windows,
so I'm looking forward to
doing my mode line in such a way that
for example, it shows most of those things.
And Prot actually has
an excellent video about that
where he shows how you can create
your own custom mode line.
[Sacha]: I've also been tempted
to start using the header line too
because that's another thing
that you can put information in.
[Amin]: Right, yep, header-line is awesome.
[Sacha]: Yeah, the display-buffer-alist
is particularly powerful
because you're combining it with EXWM, so it'd be
interesting to see how you can manage windows and
applications and stuff.
[Amin]: Especially, just like how we saw
in today's video call
and also a call that I had with Prot recently.
For example, if I open a describe-variable or
something, it'll by default use the right area of the
screen right now where our video is.
So it reuses that.
So I'm also looking forward to reading more about and
configuring display-buffer-alist.
I'd like to figure out some TRAMP slowness.
I recently tried using it again.
It's awesome.
You can seamlessly open files, SSH into other
machines and edit files there.
But I don't know.
It's kind of slow.
So I want to see aside from the latency, you know, the
physical limit of the latency because of the distance.
Is there anything slowing it down?
I think I read in the Tramp FAQ that maybe trying to
disable VC mode or VC detection for remote connections
might help speed it up, or at least having it do only
Git, for example, because by default, Emacs's VC has
support for Mercurial, CVS, SVN, Git, RCS even.
[Sacha]: Anything anyone has ever wanted to use in the
last 40 years.
Here we go.
I saw in your chat config actually that you were doing
something with the SSH configs and I'd never come
across that.
So I was like, oh, that's something I should look into
later.
[Amin]: I don't remember the specifics, but it's all
out there.
Feel free to look into it.
Especially with this EXWM setup, I still use Xterm
sometimes and I have the Emacs EAT terminal, which is
a terminal emulator written in Emacs Lisp.
If I launch it right now, it's awesome.
It actually is very powerful and it's a properly
capable terminal emulator.
It just can be a little bit slow.
It is slower than xterm, but it's still a lot faster
than whatever Emacs has built in.
So this is pretty cool.
But yeah, I don't want to use it a lot.
And I kind of started testing, delegating more
things or using more async-shell-command to just
basically open this prompt and then do whatever I
want.
anyway.
[Sacha]: I've also heard things about Ghost TTY.
Anyway, so that's another thing to look into.
Yes, so @Paniash47 says, "With Emacs 31, there's a new
variable where you can hide the minor modes in the
mode line."
@pkal says it's mode-line-collapse-minor-modes.
And @Paniash47 also says, "I personally use the Minions
package by Tarsius, and it has some nice features in
addition to the built-in features."
So other people are tinkering around
with their mode lines as well.
[Amin]: Yeah, it's pretty cool.
And then I don't know, I think maybe you touched on
something a couple of minutes ago that I was going to
go back to, but I forget.
[Sacha]: Tramp SSH completion out of your configs.
I was like, there's a Tramp sconfig in here that I've
never used.
And that sounded interesting.
Yeah, tramp-parse-sconfig.
[Amin]: Ah, right, right, right. Yeah.
[Sacha]: Which, of course, we're not going to let go
because it's private stuff, but yeah.
[Amin]: Right.
Yeah, you're welcome to try this.
I'm pretty sure, actually, I took this from the Tramp
manual itself.
And it's one of those things where it's set and
forget, I don't remember.
But yeah, it's here.
There was something else that I also wanted to show,
but I forget.
Let me see if looking at the outlines will remind me
or if I will see it.
[Sacha]: And that's one of the things I love about
literate configuration is, you know, just kind of look
at the structure and skim it and try to find something
with keywords and ordered lists and all that stuff.
[Amin]: Right. Yup. Exactly.
[Sacha]: Oh, and you know, people will have access to
your full configuration because it is in your
repository and you have that lovely HTML export for it
as well.
So if you, uh, if, if people want to follow up, they
can go through that
at length. At some point, you're going to add some more
screenshots and possibly even video clips to it.
so that's there you at https://git.kelar.org
[Amin]: This is my configurations repository.
If you go here to treeview .emacs.d, this is the org
file.
I also export all of those individual components into
this lisp subdirectory.
All that stuff is here.
The QMK thingy that was mentioned.
Oh, I wanted to mention FFS.
Okay, I'll do that as well.
Yeah, what's up with that?
[Sacha]: I was trying to find information.
It was like, there's no package.
It's not what is this thing?
[Amin]: It's FormFeed Slides and it's going to soon be
a package.
I was actually talking to Prot about it and I'm hoping
to submit it for inclusion in GNU ELPA within, I don't
know, the next couple of weeks.
It's basically very similar to Prot's Logos package.
Turns out we both had the same kind of idea at the
exact same time in 2022, and we both used it for our
LibrePlanet 2022 presentations.
Of course, Prot being the diligent person that he is,
he polished his work, documented it,
put it on GNU ELPA.
I still haven't gotten around to doing it yet,
but better late than never.
Yeah, let's see.
I can maybe show a quick demonstration of that.
So let's see.
Let's see.
Anyway, so if I go to my website sources and
net-beyond-web.
So I had the LibrePlanet talk a couple years ago.
So what FFS is basically, it looks for a
particular character in this case,
or the default case,
it's the page-delimiter, ^L,
which you can insert by hitting C-q C-l.
It basically then designates each of these areas
as one slide. So, very, very simple slideshow
that you don't even have to use Org or outline or any
other major or minor mode. If I launch ffs,
by default, it's in a mode where it binds a couple of
convenience keys, like p and n, to go into the next
and previous slide.
You can hit e to edit a slide, similar to Org source, and
then make your changes and all of that.
And then you can start a presentation by hitting s.
It has hooks for, for example, bumping up the font size
or whatever, hiding the mode line.
I can toggle the mode line by hitting m here.
Let's see.
I can also toggle the cursor with c, to make the cursor
visible or not.
So, yeah.
And then I'm just hitting p and n.
[Sacha]: Very simple, very minimalist.
You have a file, you've got page markers, and that's
all you got.
[Amin]: Yeah, pretty much.
And then…
The neat thing that it has that I also liked
implementing at the time is it has a speaker notes
feature.
So you can designate a file as being the speaker
notes where it has the same structure separators with
^L. But you can type your notes over here,
whatever.
And you can basically open these in two different
windows or two different frames on separate displays.
And then in whichever one of those you advance the
slides, like p n n, it also does the other one.
[Sacha]: That's brilliant.
I was looking for a way to do that so I can pretend to
know what I'm talking about when I have something on
screen, but I can just read my notes or even just
remember what points I wanted to make.
So this is great.
You have speaker notes.
You've got the main screen.
They can be in two different frames.
You can have your frame that you're sharing and your
frame that you're not sharing that has all of your
cheat sheets.
Excellent.
And on that note, in about one minute, the kid is
going to come running out and want to have snack and
all that stuff.
Thank you so much for walking through parts of your
config.
There is more.
And so everyone who wants to find out more can go
check out your setup.
I have a great many things that I want to try out,
starting from EXWM to little things like figuring out
a boom mic setup because apparently your audio setup
is making me very jealous.
Yes, thank you for doing this.
I'm going to post the transcript and the chapters.
I have a chapter every minute.
It's going to be a long time.
But it was good.
Lots of cool stuff.
Thank you again.
[Amin]: Sounds great.
And yeah, you're very welcome.
And thank you so much for having me as well, Sacha.
I'm very delighted to be here, especially, I think,
just by chance.
I think I'm the first person who you're doing this
with after the long hiatus.
So that's an extra honor for me.
But yeah, it's been fun.
I could go on for hours.
I'm sure we both could.
This has been fun.
[Sacha]: If we wanted to go on for hours,
Prot has more flexible scheduling,
so he can chat with people for
two hours and stuff, and you already have
conversations going on with him.
But I unfortunately have a small mammal who's 10
years old and loves me very much, and likes to not let
me concentrate for very long.
But thank you everyone for joining.
Thank you for the chat.
And thank you also, stream,
for all the interesting questions.
I will send you all the information
and update the post.
And we'll see you all on Thursday.
I've got another chat.
All of a sudden, all these Emacs chats
are going to happen.
Thanks.
Oh, and you said you're happy to be on the hook for
doing another EmacsConf this year, right?
[Amin]: Yes. You can hold me to that.
There will be another EmacsConf this year
and I will be active in it.
[Sacha]: Alright then, I'm going to end that broadcast.
Thanks everyone, bye!
[Amin]: Thank you, bye bye!