WEBVTT captioned by bhavin192
00:00:00.000 --> 00:00:04.600
Hello. Welcome to my first ever EmacsConf talk.
00:00:04.600 --> 00:00:06.360
This is really exciting for me.
00:00:06.360 --> 00:00:08.600
I've done lots of conferences,
00:00:08.600 --> 00:00:12.800
but rarely ones this technical and this nerdy.
00:00:12.800 --> 00:00:13.508
I also feel like
00:00:13.508 --> 00:00:15.040
I have something interesting to share.
00:00:15.040 --> 00:00:18.680
I come to Emacs relatively late in my career,
00:00:18.680 --> 00:00:20.920
only about six years ago,
00:00:20.920 --> 00:00:22.880
but I've been absolutely amazed
00:00:22.880 --> 00:00:25.800
at the innovation and commitment of the community
00:00:25.800 --> 00:00:28.200
to do things their own way.
00:00:28.200 --> 00:00:30.120
Oftentimes, these become things
00:00:30.120 --> 00:00:33.880
that are not readily available anywhere else.
00:00:33.880 --> 00:00:35.307
So, as I've been using Emacs
00:00:35.307 --> 00:00:37.160
(and Org mode specifically)
00:00:37.160 --> 00:00:39.600
a great deal in my day-to-day workflows,
00:00:39.600 --> 00:00:41.520
I've been leaning more and more into
00:00:41.520 --> 00:00:43.607
some of these tips and tricks.
00:00:43.607 --> 00:00:46.680
I find that there is almost every day
00:00:46.680 --> 00:00:48.120
that I discover some useful tweak
00:00:48.120 --> 00:00:50.760
that can make my development better.
00:00:50.760 --> 00:00:53.960
I want to share them with you now.
00:00:53.960 --> 00:00:54.874
[Future George]: Hey, hold on!
00:00:54.874 --> 00:00:56.200
Who are you?
00:00:56.200 --> 00:01:00.400
[Future George]: I'm you from the future!
00:01:00.400 --> 00:01:02.480
Oh, nice. How good.
00:01:02.480 --> 00:01:05.240
No, I'm you from, like, a month from now.
00:01:05.240 --> 00:01:08.440
Look, you know how these talks are pre-recorded,
00:01:08.440 --> 00:01:10.760
and you know how you've spent the last two years
00:01:10.760 --> 00:01:12.400
criticizing conference speakers
00:01:12.400 --> 00:01:14.000
for trying to do the same old thing
00:01:14.000 --> 00:01:15.120
and not creatively adapting
00:01:15.120 --> 00:01:17.440
to the online conference medium?
00:01:17.440 --> 00:01:20.520
Well, you are recording this back in November.
00:01:20.520 --> 00:01:23.160
I'm in December when everyone is watching this
00:01:23.160 --> 00:01:24.720
for the first time.
00:01:24.720 --> 00:01:27.120
That is something we can do now.
00:01:27.120 --> 00:01:29.640
[George]: Okay, so this is a gimmick.
00:01:29.640 --> 00:01:32.880
Cool! And I see you still haven't figured out
00:01:32.880 --> 00:01:35.440
how to remove backgrounds with OBS.
00:01:35.440 --> 00:01:37.240
[Future George]: Oh my god! It's such a pain,
00:01:37.240 --> 00:01:40.360
I have to get a plugin or something.
00:01:40.360 --> 00:01:42.760
So, yes, it's kind of a gimmick,
00:01:42.760 --> 00:01:44.920
but I also have a cool point.
00:01:44.920 --> 00:01:46.200
You know, how you just said
00:01:46.200 --> 00:01:48.840
that you discover something new every day?
00:01:48.840 --> 00:01:49.920
Well, your talk isn't that long,
00:01:49.920 --> 00:01:52.720
and I found a bunch of cool new workflow synths.
00:01:52.720 --> 00:01:55.920
[George]: Oh, okay, that makes sense.
00:01:55.920 --> 00:01:58.360
I'm starting a new job in the intervening time.
00:01:58.360 --> 00:01:59.720
[Future George]: Exactly!
00:01:59.720 --> 00:02:02.440
So, I have more stuff I want to add.
00:02:02.440 --> 00:02:03.740
[George]: Oh, and I bet that
00:02:03.740 --> 00:02:05.960
once we set the ground rules,
00:02:05.960 --> 00:02:07.136
the audience might have
00:02:07.136 --> 00:02:08.960
some of their own suggestions.
00:02:08.960 --> 00:02:11.160
That is a good idea.
00:02:11.160 --> 00:02:11.960
Okay, go away now.
00:02:11.960 --> 00:02:13.574
[Future George]: Fine, but
00:02:13.574 --> 00:02:15.240
aren't you gonna explain the dino?
00:02:15.240 --> 00:02:18.800
[George]: This is EmacsConf, dude.
00:02:18.800 --> 00:02:20.320
You think a dinosaur built out of
00:02:20.320 --> 00:02:22.160
boxes and old dishwasher parts
00:02:22.160 --> 00:02:24.207
is the weirdest background thing we'll see?
00:02:24.207 --> 00:02:27.880
[Both making dinosaur roaring sound: ROAAAAR!]
00:02:27.880 --> 00:02:30.200
Okay, bye now.
00:02:30.200 --> 00:02:33.160
Hey everyone, you heard the idea.
00:02:33.160 --> 00:02:35.000
This is going to be a thinly-veiled attempt
00:02:35.000 --> 00:02:36.940
to show you stuff about
00:02:36.940 --> 00:02:38.760
Emacs and Org mode, specifically,
00:02:38.760 --> 00:02:41.560
that I think is super cool and immediately useful
00:02:41.560 --> 00:02:43.600
while you're doing development.
00:02:43.600 --> 00:02:46.720
Let's define the scope of Org development workflow
00:02:46.720 --> 00:02:49.000
as something specific you do with Org mode
00:02:49.000 --> 00:02:50.800
that helps in certain common
00:02:50.800 --> 00:02:52.880
development related activities.
00:02:52.880 --> 00:02:54.560
Now, tie-dye me from the future said
00:02:54.560 --> 00:02:56.960
he's got some more ideas
00:02:56.960 --> 00:02:58.840
beyond what I'm presenting here.
00:02:58.840 --> 00:03:01.960
I'm sure many of you have ideas as well.
00:03:01.960 --> 00:03:07.960
So, we're going to share a collaborative document,
00:03:07.960 --> 00:03:10.120
and let's all as we're listening to this
00:03:10.120 --> 00:03:11.440
be talking, and chatting, and entering
00:03:11.440 --> 00:03:13.240
our own ideas and workflows,
00:03:13.240 --> 00:03:15.680
so that we can learn and improve together.
00:03:15.680 --> 00:03:17.960
And now with that, let's begin.
00:03:17.960 --> 00:03:20.280
I've got a ton of ground to cover,
00:03:20.280 --> 00:03:23.480
and I want to start by talking about note-taking.
00:03:23.480 --> 00:03:25.720
Shrink down! [transition]
00:03:25.720 --> 00:03:30.074
Note-taking is incredibly important.
00:03:30.074 --> 00:03:33.600
We can't keep all this stuff in our heads.
00:03:33.600 --> 00:03:36.640
So, for example, I find myself with
00:03:36.640 --> 00:03:41.760
the need to learn about the solid project.
00:03:41.760 --> 00:03:44.520
This right here is the solid project,
00:03:44.520 --> 00:03:47.320
and I want to play around with it.
00:03:47.320 --> 00:03:50.920
I am going to start by creating a note for it.
00:03:50.920 --> 00:03:53.360
Now, one of the things that I want to do
00:03:53.360 --> 00:03:57.240
is explore one of their tutorials.
00:03:57.240 --> 00:03:58.960
That's the site I just saw.
00:03:58.960 --> 00:04:03.720
I can go ahead and create a note for myself.
00:04:03.720 --> 00:04:10.280
Right, "Solid React Example",
00:04:10.280 --> 00:04:12.120
and maybe a set of stuff ending on there.
00:04:12.120 --> 00:04:14.240
I'm going to clone this project,
00:04:14.240 --> 00:04:15.720
which I've already done,
00:04:15.720 --> 00:04:18.360
and I can pull it up right here.
00:04:18.360 --> 00:04:22.280
So, I can pull it up right here,
00:04:22.280 --> 00:04:24.440
and I can now start to explore it.
00:04:24.440 --> 00:04:26.440
So, for example, this code base sounds…,
00:04:26.440 --> 00:04:27.080
it seems interesting.
00:04:27.080 --> 00:04:28.996
I'm going to want to
00:04:28.996 --> 00:04:31.520
store a link to this in my code.
00:04:31.520 --> 00:04:34.840
I'm going to run `org-store-link`,
00:04:34.840 --> 00:04:37.960
and I can come in here and say,
00:04:37.960 --> 00:04:48.280
let's explore structure. Local link,
00:04:48.280 --> 00:04:50.640
and here I'm going to put that right there.
00:04:50.640 --> 00:04:52.960
Now, at any given time I can come into this note
00:04:52.960 --> 00:04:54.600
and be thrown right into the structure.
00:04:54.600 --> 00:04:58.880
I want to go and now start investigating the code,
00:04:58.880 --> 00:05:02.474
but before doing that
00:05:02.474 --> 00:05:08.280
I'm going to take an extra step
00:05:08.280 --> 00:05:13.560
and customize the Org capture system.
00:05:13.560 --> 00:05:16.297
I'm going to create a playground node here,
00:05:16.297 --> 00:05:17.320
where I can do whatever.
00:05:17.320 --> 00:05:20.680
Now, what does this template do?
00:05:20.680 --> 00:05:22.960
Well, it's just going to create a new template.
00:05:22.960 --> 00:05:24.640
And whenever I hit the s key,
00:05:24.640 --> 00:05:31.680
it is going to go ahead and add a new heading
00:05:31.680 --> 00:05:36.280
to which I will enter,
00:05:36.280 --> 00:05:38.326
and it's going to grab a link
00:05:38.326 --> 00:05:39.720
to wherever I'm pointing at,
00:05:39.720 --> 00:05:41.760
and any highlighted code
00:05:41.760 --> 00:05:44.560
will also be inserted into a source block,
00:05:44.560 --> 00:05:49.407
and eventually, drop my cursor
00:05:49.407 --> 00:05:52.107
where I can work on it.
00:05:52.107 --> 00:05:55.000
So, we can grab our template,
00:05:55.000 --> 00:05:57.400
and the one thing I'm going to need to add it here
00:05:57.400 --> 00:05:59.360
is to say what file this goes to.
00:05:59.360 --> 00:06:03.760
I'm going to copy the name of this file,
00:06:03.760 --> 00:06:08.040
and put it right in there.
00:06:08.040 --> 00:06:10.680
I'm going to go ahead now run this template.
00:06:10.680 --> 00:06:14.400
Now, we can explore our code.
00:06:14.400 --> 00:06:16.440
For example, I can look in the server,
00:06:16.440 --> 00:06:18.400
and say, "Oh yeah, this slide looks interesting.
00:06:18.400 --> 00:06:21.040
Go ahead and capture that."
00:06:21.040 --> 00:06:23.800
There you see our template.
00:06:23.800 --> 00:06:26.000
You see, yeah, this is Next.js app,
00:06:26.000 --> 00:06:29.320
and you can see it got added right in here
00:06:29.320 --> 00:06:33.080
right next to my other code.
00:06:33.080 --> 00:06:34.640
So, that's interesting.
00:06:34.640 --> 00:06:36.920
I can always go ahead and click that link,
00:06:36.920 --> 00:06:40.560
and get thrown directly to where in the code I was.
00:06:40.560 --> 00:06:43.240
I'm kind of building up my own dashboard
00:06:43.240 --> 00:06:45.040
as I explore this project
00:06:45.040 --> 00:06:49.160
of interesting points within the project.
00:06:49.160 --> 00:06:52.440
One of the things I noticed here
00:06:52.440 --> 00:06:57.440
by looking at the file structure is that
00:06:57.440 --> 00:07:02.040
there is an area for certificates.
00:07:02.040 --> 00:07:05.625
That's a little unusual, so we'll make a note
00:07:05.625 --> 00:07:08.007
of that by again running `org-store-link`.
00:07:08.007 --> 00:07:12.707
This comes with certificates,
00:07:12.707 --> 00:07:18.007
so we'll put that there.
00:07:18.007 --> 00:07:21.607
One of the good standbys is,
00:07:21.607 --> 00:07:23.540
just to use our regular shell commands.
00:07:23.540 --> 00:07:26.774
So, we will go ahead and say,
00:07:26.774 --> 00:07:29.807
the default directory for this is our project.
00:07:29.807 --> 00:07:31.640
And we can go ahead and say,
00:07:31.640 --> 00:07:38.520
`cat certificates/localhost.key`,
00:07:38.520 --> 00:07:43.760
and then we'll output the first five lines of it,
00:07:43.760 --> 00:07:45.848
just to make sure it's a regular certificate.
00:07:45.848 --> 00:07:49.360
Now, notice this got broken up a little bit.
00:07:49.360 --> 00:07:51.720
This is due to Emacs auto formatting.
00:07:51.720 --> 00:07:55.866
We can come in here, and tell it to
00:07:55.866 --> 00:07:57.400
format it as code,
00:07:57.400 --> 00:07:59.880
which will be the same as this block right here.
00:07:59.880 --> 00:08:02.320
Now, there are other options available.
00:08:02.320 --> 00:08:05.453
If, for example, we don't want [it]
00:08:05.453 --> 00:08:06.480
to be a shell block,
00:08:06.480 --> 00:08:09.560
we wanted a Python block for some reason,
00:08:09.560 --> 00:08:15.320
we do `:wrap src python`, and execute that,
00:08:15.320 --> 00:08:18.440
and it's now wrapped as a Python block,
00:08:18.440 --> 00:08:21.480
but I like it as a shell.
00:08:21.480 --> 00:08:24.240
Let's, for example, go down into pages here
00:08:24.240 --> 00:08:25.800
and look at this document file.
00:08:25.800 --> 00:08:29.160
We're saying, "Okay. Well, this looks interesting
00:08:29.160 --> 00:08:32.474
maybe highlight that," and we'll go ahead
00:08:32.474 --> 00:08:36.240
and capture that template
00:08:36.240 --> 00:08:39.400
and say, grab all this code and paste it in here.
00:08:39.400 --> 00:08:42.440
Now, there is a bug at the moment,
00:08:42.440 --> 00:08:46.280
where if you highlight more than one lines of code,
00:08:46.280 --> 00:08:50.760
the link will not work, and that honestly
00:08:50.760 --> 00:08:54.540
might be something I look into fixing.
00:08:54.540 --> 00:08:57.507
One of the things that might be useful here
00:08:57.507 --> 00:08:59.274
would be to check out
00:08:59.274 --> 00:09:02.107
how this file has evolved over time.
00:09:02.107 --> 00:09:05.340
To do that, I'm going to use Magit.
00:09:05.340 --> 00:09:09.640
I'll pull up a log.
00:09:09.640 --> 00:09:11.400
Look, there's only a single change.
00:09:11.400 --> 00:09:13.040
I'm going to run a command
00:09:13.040 --> 00:09:16.840
called `orgit-store-link`,
00:09:16.840 --> 00:09:22.174
and now I can come in here and say,
00:09:22.174 --> 00:09:26.207
"It's only changed once."
00:09:26.207 --> 00:09:30.274
Go ahead and insert that link.
00:09:30.507 --> 00:09:33.340
Now, this file…
00:09:33.340 --> 00:09:32.960
the arguments here are kind of weird,
00:09:35.800 --> 00:09:38.520
and in fact, if I click this,
00:09:38.520 --> 00:09:42.040
it will actually go to the full log of that branch.
00:09:42.040 --> 00:09:45.760
However, we can fix that pretty easily.
00:09:45.760 --> 00:09:49.120
Grab the path of our file,
00:09:49.120 --> 00:09:53.874
and this right here is really just the arguments
00:09:53.874 --> 00:09:56.280
that are passed into the log command.
00:09:56.280 --> 00:09:58.880
So, here we go, we put that in there,
00:09:58.880 --> 00:10:04.960
and there we go. We get the full file history.
00:10:04.960 --> 00:10:09.280
Now, I want to actually build the program.
00:10:09.280 --> 00:10:16.520
So, "Build the app."
00:10:16.520 --> 00:10:18.800
Now, I could of course run it as a shell, right.
00:10:18.800 --> 00:10:22.560
`npm ci`. The problem with that is that
00:10:22.560 --> 00:10:26.400
Emacs is single-threaded. So, if I were to do that,
00:10:26.400 --> 00:10:30.400
the entire time while it was running,
00:10:30.400 --> 00:10:33.120
it would be locking out my Emacs.
00:10:33.120 --> 00:10:35.740
Additionally, I might not actually want
00:10:35.740 --> 00:10:38.707
all that scroll--`npm ci` produces a lot of it--
00:10:38.707 --> 00:10:40.080
actually in my document.
00:10:40.080 --> 00:10:43.840
So instead, what we could do is
00:10:43.840 --> 00:10:46.800
use an Emacs Lisp function,
00:10:46.800 --> 00:10:49.640
and it's called `async-shell-command`.
00:10:49.640 --> 00:10:52.880
And when you run something in async-shell-command,
00:10:52.880 --> 00:10:58.007
it's going to a comint buffer with a process
00:10:58.007 --> 00:11:00.107
attached to it, and run it in there.
00:11:00.107 --> 00:11:04.907
I will need to set the directory here first,
00:11:04.907 --> 00:11:07.560
and since, again, this is going to be
00:11:07.560 --> 00:11:08.960
opening up in a new buffer.
00:11:08.960 --> 00:11:09.960
I don't need to see that.
00:11:09.960 --> 00:11:11.407
I'm going to run it.
00:11:11.407 --> 00:11:13.680
And what's going to happen is
00:11:13.680 --> 00:11:17.120
this is actually not going to work.
00:11:17.120 --> 00:11:18.160
And it doesn't work,
00:11:18.160 --> 00:11:20.320
Not for any particular reason I can control.
00:11:20.320 --> 00:11:24.880
It's unfortunately that the repo is broken,
00:11:24.880 --> 00:11:26.307
but that is a totally valid
00:11:26.307 --> 00:11:29.040
result of our investigation.
00:11:29.040 --> 00:11:33.107
One of the things that I really love
00:11:33.107 --> 00:11:37.640
to do with Org mode is to actually use it for
00:11:37.640 --> 00:11:38.240
literate programming,
00:11:38.240 --> 00:11:43.080
because Org mode has a pretty capable
00:11:43.080 --> 00:11:46.000
code generation facility built into it.
00:11:46.000 --> 00:11:47.440
It's called tangling.
00:11:47.440 --> 00:11:51.720
So, if I go ahead and take my document...
00:11:51.720 --> 00:11:54.107
This is for a little Arduino project,
00:11:54.107 --> 00:11:56.907
where I was figuring out to spin things around
00:11:56.907 --> 00:12:00.074
using an old Roomba motor.
00:12:00.074 --> 00:12:05.280
I can go ahead and write a script like this,
00:12:05.280 --> 00:12:09.400
and then notice, I use the tangle variable
00:12:09.400 --> 00:12:11.520
that is just going to determine
00:12:11.520 --> 00:12:13.560
where that file gets written
00:12:13.560 --> 00:12:17.680
when we call the command `org-babel-tangle`.
00:12:17.680 --> 00:12:20.080
So, if I go ahead and run this,
00:12:20.080 --> 00:12:21.800
you can see down in the minibuffer,
00:12:21.800 --> 00:12:23.040
it's going to write to
00:12:23.040 --> 00:12:26.707
`/tmp/go-batsy-playground/go-batsy-playground.ino`.
00:12:26.707 --> 00:12:27.840
That's where this right here would write,
00:12:29.240 --> 00:12:33.480
and then I could run commands on it.
00:12:33.480 --> 00:12:36.574
Then I want to start being able to use this
00:12:36.574 --> 00:12:38.600
to build out a program.
00:12:38.600 --> 00:12:42.000
I'm going ahead and writing in prose
00:12:42.000 --> 00:12:43.440
and interspersing it with code.
00:12:43.440 --> 00:12:47.160
So, it's the inverse of code,
00:12:47.160 --> 00:12:49.374
in which you intersperse comments, [here]
00:12:49.374 --> 00:12:51.640
you write prose, and then you intersperse code
00:12:51.640 --> 00:12:54.920
where as needed.
00:12:54.920 --> 00:12:58.120
Tangle is implicitly defined up at the higher level
00:12:58.120 --> 00:12:59.640
in this property block right here,
00:12:59.640 --> 00:13:02.600
which I will talk about in a little bit.
00:13:02.600 --> 00:13:04.720
But if you want to see what properties
00:13:04.720 --> 00:13:07.400
are available at any given time,
00:13:07.400 --> 00:13:10.140
you can hit `org-babel-view-src-block-info`
00:13:10.140 --> 00:13:14.274
right there, and you can see that tangle is enabled.
00:13:14.274 --> 00:13:16.440
All of these blocks have the exact same tangle.
00:13:16.440 --> 00:13:20.800
If I run and see what it is, it's just going to
00:13:20.800 --> 00:13:23.680
write to this directory to `go-batsy.ino`.
00:13:23.680 --> 00:13:28.920
`org-babel-tangle` is going to go ahead
00:13:28.920 --> 00:13:30.640
and tangle all these source code blocks,
00:13:30.640 --> 00:13:33.174
and I can go ahead and look at my file
00:13:33.174 --> 00:13:34.440
and here it is.
00:13:34.440 --> 00:13:36.240
This is the full Arduino file
00:13:36.240 --> 00:13:37.360
that was generated from there.
00:13:37.360 --> 00:13:40.807
I start writing code here,
00:13:40.807 --> 00:13:43.320
and I'm basically doing it in a prose way.
00:13:43.320 --> 00:13:44.640
As I'm thinking about it,
00:13:44.640 --> 00:13:46.080
I write down what I'm going to do.
00:13:46.080 --> 00:13:49.240
Now these braces, we haven't seen these before.
00:13:49.240 --> 00:13:50.440
This is an aspect of Org called `noweb`,
00:13:52.680 --> 00:13:55.374
which again is not too much of a
00:13:55.374 --> 00:13:56.400
templating system too.
00:13:56.400 --> 00:13:58.960
But it does one thing, which is insert code,
00:13:58.960 --> 00:14:00.200
which turns out to be enough.
00:14:00.200 --> 00:14:03.640
So, this right here basically says,
00:14:03.640 --> 00:14:08.507
take that block with that exact name
00:14:08.507 --> 00:14:09.960
and just insert here.
00:14:09.960 --> 00:14:13.760
If you want to see exactly what a block expands to,
00:14:13.760 --> 00:14:15.160
you're going to come in here.
00:14:15.160 --> 00:14:18.320
You're going to run `org-babel-expand-src-block`,
00:14:18.320 --> 00:14:21.000
and there we go. That's what this block expands to.
00:14:21.000 --> 00:14:22.080
That's what all those places
00:14:22.080 --> 00:14:24.807
of this little bits and pieces expand to.
00:14:24.807 --> 00:14:26.120
So, that becomes really useful, and notice
00:14:28.120 --> 00:14:29.960
basically we just take these little blocks
00:14:29.960 --> 00:14:32.520
that are not going to be tangled directly
00:14:32.520 --> 00:14:33.920
but it will be in this other block.
00:14:33.920 --> 00:14:38.074
And we turn off their tangling.
00:14:38.074 --> 00:14:40.680
Now that you have some sort of tangling,
00:14:40.680 --> 00:14:42.880
you want to be able to interact with those files
00:14:42.880 --> 00:14:46.707
that are written to that directory.
00:14:46.707 --> 00:14:48.960
So, right here I have an area
00:14:48.960 --> 00:14:52.760
where I can do things like run a compiler.
00:14:52.760 --> 00:14:55.160
Now what does that compiler do?
00:14:55.160 --> 00:14:57.840
Well, this right here references
00:14:57.841 --> 00:15:01.874
a source code block that appears in another Org file.
00:15:01.874 --> 00:15:04.520
And I find that when doing these sort of things
00:15:04.520 --> 00:15:06.007
it can be useful to have a little
00:15:06.007 --> 00:15:08.000
utility Org directory.
00:15:08.000 --> 00:15:10.374
So, here it is, `org/ci.org`.
00:15:10.374 --> 00:15:11.640
This is just part of my repo.
00:15:11.640 --> 00:15:14.140
We open up, and here we go.
00:15:14.140 --> 00:15:15.200
I have a compile function.
00:15:15.200 --> 00:15:18.360
Basically, it's doing some stuff
00:15:18.360 --> 00:15:20.480
to clean up things correctly.
00:15:20.480 --> 00:15:23.520
But then using that same `async-shell-command`
00:15:23.520 --> 00:15:26.280
to open things up and a new buffer.
00:15:26.280 --> 00:15:28.674
In this case, named after
00:15:28.674 --> 00:15:31.200
whatever heading it was under.
00:15:31.200 --> 00:15:35.160
And then we're going to go ahead and inside of it
00:15:35.160 --> 00:15:39.874
run Arduino CLI command to compile,
00:15:39.874 --> 00:15:43.560
and pass that into `watchexec`.
00:15:43.560 --> 00:15:46.120
which is a little Rust program
00:15:46.120 --> 00:15:49.520
that watches inode[??] files for any changes,
00:15:49.520 --> 00:15:51.240
and when they detect them, we will run this.
00:15:51.240 --> 00:15:56.160
If I were to, for example, add a line here,
00:15:56.160 --> 00:15:59.360
and now run `org-babel-tangle`,
00:15:59.360 --> 00:16:02.400
you can see watchexec immediately
00:16:02.400 --> 00:16:04.480
picks it up and restarts it.
00:16:04.480 --> 00:16:07.474
Now it's kind of a pain to remember
00:16:07.475 --> 00:16:09.680
to run `org-babel-tangle` all the time.
00:16:09.680 --> 00:16:13.807
So, I can come here and click this button.
00:16:13.807 --> 00:16:17.040
It asks me to execute it there.
00:16:17.040 --> 00:16:18.280
And what does that do?
00:16:18.280 --> 00:16:23.280
Here you go. It's just a very simple hyperlink,
00:16:23.280 --> 00:16:25.600
but to the Elisp protocol.
00:16:25.600 --> 00:16:30.600
The Elisp protocol just adds a hook that says,
00:16:30.600 --> 00:16:35.107
whenever a document is saved, run `org-babel-tangle`.
00:16:35.107 --> 00:16:37.600
And now that I've run that, I can go ahead,
00:16:37.600 --> 00:16:39.307
come in here, and delete that.
00:16:39.307 --> 00:16:42.340
And look at that. It tangles automatically for me.
00:16:42.340 --> 00:16:45.040
Because I don't want to actually have this
00:16:45.040 --> 00:16:49.480
playground script tangle to my real file,
00:16:49.480 --> 00:16:51.440
I need this concept of
00:16:51.440 --> 00:16:52.760
some sort of workspace directory.
00:16:52.760 --> 00:16:54.880
And a workspace directory
00:16:54.880 --> 00:16:58.280
what I really want is a variable that is tied to
00:16:58.280 --> 00:17:02.674
where in my document hierarchy this appears.
00:17:02.674 --> 00:17:06.680
I want a dynamically scoped variable
00:17:06.680 --> 00:17:08.240
that's scoped to my document.
00:17:08.240 --> 00:17:12.560
And you can do that. For example, in this case,
00:17:12.560 --> 00:17:15.280
I have in my properties
00:17:15.280 --> 00:17:20.080
a key value declared `workspace-directory`,
00:17:20.080 --> 00:17:22.080
[it] goes into a temp directory.
00:17:22.080 --> 00:17:24.480
And here, by running `org-get-entry`
00:17:24.480 --> 00:17:25.800
starting at the current point,
00:17:25.800 --> 00:17:27.507
find `workspace-directory`
00:17:27.507 --> 00:17:28.760
with a second parameter 1.
00:17:28.760 --> 00:17:31.520
You can see down in the minibuffer,
00:17:31.520 --> 00:17:37.174
goes to `/tmp/go-batsy-playground/`.
00:17:37.174 --> 00:17:39.720
This right here is going to override
00:17:42.040 --> 00:17:44.307
the `workspace-directory` at the top level,
00:17:44.307 --> 00:17:47.607
which is dot. Dot means here.
00:17:47.607 --> 00:17:48.880
That's what makes sure
00:17:48.880 --> 00:17:50.680
that the rest of these tangle to
00:17:50.680 --> 00:17:54.560
that go-batsy file right relevant to here.
00:17:54.560 --> 00:17:55.740
And that does mean that we need
00:17:55.740 --> 00:17:58.207
a little bit more complex thing here.
00:17:58.207 --> 00:18:01.760
So, we're saying go ahead and `org-entry-get`
00:18:01.760 --> 00:18:04.800
the `workspace-directory`.
00:18:04.800 --> 00:18:06.807
If anyone hasn't seen this syntax,
00:18:06.807 --> 00:18:16.040
this dash arrow is from the dash.el library,
00:18:16.040 --> 00:18:19.240
which is basically a big library of all
00:18:19.240 --> 00:18:20.940
the utility functions that you wish
00:18:20.940 --> 00:18:22.880
Emacs Lisp had. They're well-named.
00:18:22.880 --> 00:18:24.480
I highly, highly recommend it.
00:18:24.480 --> 00:18:26.080
This is the threading operator.
00:18:26.080 --> 00:18:28.200
So, we're just basically taking it,
00:18:28.200 --> 00:18:29.760
getting the `workspace-directory`,
00:18:29.760 --> 00:18:32.307
if it happens to be dot, then we're just going to
00:18:32.307 --> 00:18:33.320
return the current directory,
00:18:33.320 --> 00:18:36.000
otherwise whatever directory said.
00:18:36.000 --> 00:18:39.240
And then I want to just take a moment
00:18:39.240 --> 00:18:41.280
and look at the rest of this structure.
00:18:41.280 --> 00:18:43.080
So, `workspace-directory` we talked about.
00:18:43.080 --> 00:18:46.774
`header-args` if you noticed, none of my
00:18:46.774 --> 00:18:48.707
code blocks for the most part
00:18:48.707 --> 00:18:50.840
have any header arguments.
00:18:50.840 --> 00:18:53.174
You can drop the `header-args` property,
00:18:53.174 --> 00:18:55.607
which is going to be header arguments
00:18:55.607 --> 00:18:57.840
that are added automatically
00:18:57.840 --> 00:19:03.407
to all source code blocks under this heading.
00:19:03.407 --> 00:19:05.407
`header-args+`. Well,
00:19:05.407 --> 00:19:06.540
sometimes you don't want to type…
00:19:06.540 --> 00:19:07.507
you have a bunch of args,
00:19:07.507 --> 00:19:08.240
you don't want to type them out
00:19:08.240 --> 00:19:09.440
in this one big line.
00:19:09.440 --> 00:19:11.040
So, you basically are adding a new header-arg
00:19:13.320 --> 00:19:15.407
to the existing list of header.
00:19:15.407 --> 00:19:18.160
And then you can have header-args that are specific
00:19:18.160 --> 00:19:20.440
to certain languages, like, for example,
00:19:20.440 --> 00:19:21.560
this `default-directory` var is going to be set
00:19:23.720 --> 00:19:25.200
for all Emacs Lisps.
00:19:25.200 --> 00:19:29.574
And for all Arduinos, evaluation will be disabled,
00:19:29.574 --> 00:19:32.440
and tangling will be automatically enabled.
00:19:32.440 --> 00:19:35.307
These are just some of the workflows that become
00:19:35.307 --> 00:19:38.320
useful when you're actually doing the coding.
00:19:38.320 --> 00:19:41.374
[Future George]: Oh, hello again!
00:19:41.374 --> 00:19:45.307
Me from the six months from now.
00:19:45.307 --> 00:19:49.107
[George]: Cool.
00:19:49.107 --> 00:19:51.000
[Future George]: The talk got over, people liked it,
00:19:51.000 --> 00:19:53.040
thought the pacing was all over the place.
00:19:53.040 --> 00:19:56.360
[George]: Yeah, I had to cut two thirds of it,
00:19:56.360 --> 00:19:59.800
going to be filling in those gaps in the Etherpad.
00:19:59.800 --> 00:20:03.520
[Future George]: And the editing was uneven, at best.
00:20:03.520 --> 00:20:05.507
[George]: I got way better at it
00:20:05.507 --> 00:20:06.680
as I worked on it, didn't I?
00:20:06.680 --> 00:20:09.960
Kdenlive is pretty cool.
00:20:09.960 --> 00:20:13.540
But yeah, I wanted to take a shot at
00:20:13.540 --> 00:20:16.040
something different, and I figured if anyone can
00:20:16.040 --> 00:20:17.760
appreciate trying something different,
00:20:17.760 --> 00:20:20.120
it's EmacsConf, right?
00:20:20.120 --> 00:20:21.520
I hope people found it useful.
00:20:21.520 --> 00:20:22.600
[Future George]: Yeah, some did.
00:20:22.600 --> 00:20:26.920
Oh, I should tell you about the coming Orca war.