WEBVTT
00:00:03.600 --> 00:00:04.400
Adam: Hello!
00:00:04.400 --> 00:00:06.560
Welcome to Readme Driven Design in Emacs
00:00:06.560 --> 00:00:08.400
by Adam Aard.
00:00:08.400 --> 00:00:10.800
If you're a programmer, you're accustomed
00:00:10.800 --> 00:00:13.759
to putting a README file at the root of your project.
00:00:13.759 --> 00:00:15.845
It's usually a Markdown file
00:00:15.845 --> 00:00:20.579
But if you use an Org Mode file instead,
00:00:20.579 --> 00:00:22.560
you can take advantage of the great features
00:00:22.560 --> 00:00:24.898
that Org Mode provides,
00:00:24.898 --> 00:00:25.920
including literate programming,
00:00:25.920 --> 00:00:28.000
which lets you generate your source code
00:00:28.000 --> 00:00:31.840
and Markdown documentation dynamically.
00:00:31.840 --> 00:00:34.719
I want to walk you through a little bit
00:00:34.719 --> 00:00:37.120
of what this looks like.
00:00:37.120 --> 00:00:39.607
When you start a project,
00:00:39.607 --> 00:00:41.179
especially if you use something like Github
00:00:41.179 --> 00:00:45.913
you begin with an automatically generated
README.md file.
00:00:45.913 --> 00:00:47.039
So just delete that
00:00:47.039 --> 00:00:50.239
and instead, create a README.org file.
00:00:50.239 --> 00:00:51.712
Starting with an empty Org file,
00:00:51.712 --> 00:00:54.800
like you see here, you can begin
00:00:54.800 --> 00:00:56.295
by recording important information
00:00:56.295 --> 00:00:59.440
about your project goals. You can add diagrams,
00:00:59.440 --> 00:01:03.520
code snippets, to-do lists, time
tracking, and much more.
00:01:03.520 --> 00:01:05.360
I'm going to drop in some documentation
00:01:05.360 --> 00:01:07.760
that I've written about
00:01:07.760 --> 00:01:12.240
about my project here, so you can see
00:01:12.240 --> 00:01:15.280
what this would look like.
00:01:15.280 --> 00:01:17.870
As you can see, I have a title,
00:01:17.870 --> 00:01:20.320
and a description, and then a subsection
00:01:20.320 --> 00:01:23.840
as well as some code snippets.
00:01:23.840 --> 00:01:25.210
You can see that Org Mode does
00:01:25.210 --> 00:01:28.240
a great job of formatting lists,
00:01:28.240 --> 00:01:31.280
code sections, diagrams, and so forth.
00:01:31.280 --> 00:01:35.040
It's as good or better than Markdown,
00:01:35.040 --> 00:01:37.179
but when you use it in Emacs,
00:01:37.179 --> 00:01:38.880
you can do a lot more.
00:01:38.880 --> 00:01:43.360
For example, you can dynamically create
diagrams using Graphviz
00:01:43.360 --> 00:01:45.553
from a text description.
00:01:45.553 --> 00:01:48.266
If you go to this source block here
and hit C-c C-c,
00:01:48.266 --> 00:01:52.979
you'll see that we generate a diagram
dynamically.
00:01:55.439 --> 00:02:00.519
You can run these code snippets in
place
00:02:00.519 --> 00:02:00.799
and get the results
00:02:00.799 --> 00:02:03.040
to show up inside of your file,
00:02:03.040 --> 00:02:08.000
which is a really powerful paradigm.
00:02:08.000 --> 00:02:14.800
But most importantly, for my purposes here,
00:02:14.800 --> 00:02:19.520
Org Mode provides you the ability to do literate programming.
00:02:19.520 --> 00:02:21.440
So take a quick look at this diagram
00:02:21.440 --> 00:02:23.200
that I generated here.
00:02:23.200 --> 00:02:25.912
It gives you a quick overview
00:02:25.912 --> 00:02:27.520
of what I mean by literate programming
00:02:27.520 --> 00:02:30.973
and how I'm using it.
00:02:30.973 --> 00:02:34.720
You can see that we start with a README.org file on top.
00:02:34.720 --> 00:02:40.501
At this point, we can do one of two things:
tangle or weave.
00:02:40.501 --> 00:02:43.611
Tangle is used to describe the process
00:02:43.611 --> 00:02:45.463
of generating source code,
00:02:45.463 --> 00:02:48.495
while weave is the process of generating
documentation.
00:02:48.495 --> 00:02:51.920
These are terms that Donald Knuth used.
00:02:51.920 --> 00:02:53.388
He's the one that came up
00:02:53.388 --> 00:02:55.519
with the idea of literate programming
00:02:55.519 --> 00:02:59.920
in the early 1980s.
00:02:59.920 --> 00:03:01.945
But this is really all that there is to it.
00:03:01.945 --> 00:03:05.412
You just... You are simply
00:03:05.412 --> 00:03:07.840
using a literate source file,
00:03:07.840 --> 00:03:10.575
in this case the README.org,
00:03:10.575 --> 00:03:17.120
to generate the rest of the project files, basically.
00:03:17.120 --> 00:03:22.640
So let's dig in to the details of how this works.
00:03:22.640 --> 00:03:26.159
I hope you... Hopefully you'll see how cool this is.
00:03:26.159 --> 00:03:27.545
So returning to the file here.
00:03:27.545 --> 00:03:31.120
Let's assume we have enough documentation now,
00:03:31.120 --> 00:03:32.679
that we want to get started coding.
00:03:32.679 --> 00:03:34.159
So maybe we'll just start with
00:03:34.159 --> 00:03:35.845
like a Hello World app,
00:03:35.845 --> 00:03:38.159
just so we can make sure that our
00:03:38.159 --> 00:03:41.519
environment is set up correctly.
00:03:41.519 --> 00:03:47.120
Let's get started with a code block.
00:03:47.120 --> 00:03:49.519
So I created a little snippet to help me
00:03:49.519 --> 00:03:51.326
add a source block
00:03:51.326 --> 00:03:53.599
for literate programming quickly.
00:03:53.599 --> 00:03:56.959
There's not much to it,
00:03:56.959 --> 00:03:59.479
but there are some important annotations here.
00:04:01.599 --> 00:04:05.200
Excuse me. There's a property called :tangle
00:04:05.200 --> 00:04:09.360
and that takes a value of a file name.
00:04:09.360 --> 00:04:18.880
Then there's also a :noweb property called no-export.
00:04:23.759 --> 00:04:26.800
Basically, the noexport--we'll explain
00:04:26.800 --> 00:04:29.645
that a little bit more later...
00:04:29.645 --> 00:04:32.080
It has to do with how
00:04:32.080 --> 00:04:36.845
the tangling is done in the tangle step
00:04:36.845 --> 00:04:38.479
versus the weave step.
00:04:38.479 --> 00:04:40.212
I'll explain that a little bit more.
00:04:40.212 --> 00:04:46.719
But the tangle field just simply tells
Emacs
00:04:46.719 --> 00:04:48.320
where it needs to generate the
00:04:48.320 --> 00:04:49.951
main.go file
00:04:49.951 --> 00:04:55.360
and where it needs to put it on the file system.
00:04:55.360 --> 00:04:59.040
You'll notice that we're going to use Go.
00:04:59.040 --> 00:05:01.578
That's just the language
00:05:01.578 --> 00:05:03.379
that I've been using the most lately,
00:05:03.379 --> 00:05:06.845
but this programming strategy
00:05:06.845 --> 00:05:08.400
is language-agnostic.
00:05:08.400 --> 00:05:11.279
You could use any language
00:05:11.279 --> 00:05:13.145
or any mix of languages.
00:05:13.145 --> 00:05:15.377
You could create some files
in Python,
00:05:15.377 --> 00:05:16.560
some files in Go,
00:05:16.560 --> 00:05:19.179
some files in Lisp,
00:05:19.179 --> 00:05:21.520
or whatever you want.
00:05:24.720 --> 00:05:29.440
Let's create just a little Hello World.
00:05:29.440 --> 00:05:31.379
Let's use another snippet here
00:05:31.379 --> 00:05:36.560
to generate the basics of a Go program.
00:05:36.560 --> 00:05:44.960
I'm just going to print Hello World.
00:05:44.960 --> 00:05:52.779
So that's... And then let's make it a section in our file.
00:05:52.779 --> 00:05:56.400
So now you can see, we've got this snippet.
00:05:56.400 --> 00:06:01.600
When you have a source block in
inside of Org Mode,
00:06:01.600 --> 00:06:04.960
you can easily pop into a
language-specific buffer by typing
00:06:04.960 --> 00:06:07.680
C-c ' (single quote).
00:06:07.680 --> 00:06:10.240
So you can see, now I have a
00:06:10.240 --> 00:06:12.160
buffer that's in go-mode
00:06:12.160 --> 00:06:14.240
and gives you all the ability to edit
00:06:14.240 --> 00:06:15.520
like you would
00:06:15.520 --> 00:06:19.945
normally. If you hit C-c '
(single quote)
00:06:19.945 --> 00:06:20.800
again, it goes back and
00:06:20.800 --> 00:06:25.045
any changes you make will be
updated there.
00:06:25.045 --> 00:06:26.160
But you can do quite a bit
00:06:26.160 --> 00:06:27.879
just inside of here too.
00:06:27.879 --> 00:06:29.199
There's quite a bit of
00:06:29.199 --> 00:06:34.479
language-specific functionality
00:06:34.479 --> 00:06:35.312
just in place,
00:06:35.312 --> 00:06:36.880
so you don't always have to go over to a
00:06:36.880 --> 00:06:38.080
separate buffer.
00:06:38.080 --> 00:06:42.319
It's a nice option sometimes.
00:06:42.319 --> 00:06:44.319
Now that you have the code in here,
00:06:44.319 --> 00:06:46.720
you're going to want to run it.
00:06:46.720 --> 00:06:48.179
Right now, it just lives here
00:06:48.179 --> 00:06:50.240
in this documentation.
00:06:50.240 --> 00:06:52.160
You need to get a copy of it into a
00:06:52.160 --> 00:06:53.840
separate file,
00:06:53.840 --> 00:06:57.440
and that's the tangle process that you
00:06:57.440 --> 00:07:01.360
you need to follow there. So I'm gonna
00:07:01.360 --> 00:07:03.360
drop in a little bit more doc, a little
00:07:03.360 --> 00:07:12.240
bit more documentation really quick here.
00:07:12.240 --> 00:07:19.112
Okay, all right. So just as a side note,
00:07:19.112 --> 00:07:22.845
I like to follow this process.
00:07:22.845 --> 00:07:26.639
Whenever I have an operation to perform,
00:07:26.639 --> 00:07:28.880
I'd like to document it here with a
00:07:28.880 --> 00:07:31.680
snippet that can be executed inline.
00:07:31.680 --> 00:07:33.280
Then I don't have to leave Org Mode, and
00:07:33.280 --> 00:07:34.639
I don't have to try to remember what I
00:07:34.639 --> 00:07:36.800
did later. So instead of just
00:07:36.800 --> 00:07:38.960
trying to do an operation, the first time
00:07:38.960 --> 00:07:40.319
I do something,
00:07:40.319 --> 00:07:41.680
I take the time to figure out what it is
00:07:41.680 --> 00:07:44.879
and document it, so then it's
recorded.
00:07:44.879 --> 00:07:49.120
So here we find that to do a tangle
operation,
00:07:49.120 --> 00:07:51.680
you run the command org-babel-tangle,
00:07:51.680 --> 00:07:53.779
which is an Elisp command.
00:07:53.779 --> 00:07:58.712
If you hit C-c C-c to run it in place,
00:07:58.712 --> 00:08:00.080
you get the result
00:08:00.080 --> 00:08:02.720
of main.go, which basically is
00:08:02.720 --> 00:08:03.759
telling us that
00:08:03.759 --> 00:08:07.680
we've tangled one file called main.go.
00:08:07.680 --> 00:08:11.039
You can see that's true
00:08:11.039 --> 00:08:12.879
if you go to the file system
00:08:12.879 --> 00:08:14.400
and you look.
00:08:14.400 --> 00:08:17.840
Now in our demo directory,
00:08:17.840 --> 00:08:19.712
we have a README.org,
00:08:19.712 --> 00:08:22.045
we have that PNG that we generated,
00:08:22.045 --> 00:08:23.440
but we also have a main.go.
00:08:23.440 --> 00:08:25.945
If you visit that file,
00:08:25.945 --> 00:08:27.045
you'll see that it's just
00:08:27.045 --> 00:08:28.212
the source code that was
00:08:28.212 --> 00:08:29.280
in our documentation, which is
00:08:29.280 --> 00:08:30.679
exactly what we expected
00:08:30.679 --> 00:08:32.880
and what we wanted. So that's good.
00:08:32.880 --> 00:08:41.120
So if we return to where we were at...
00:08:41.120 --> 00:08:42.959
Now we're at the point where we
00:08:42.959 --> 00:08:44.479
have a file on the file system.
00:08:45.760 --> 00:08:48.379
Now we need to build it
00:08:48.379 --> 00:08:49.612
and to run it.
00:08:49.612 --> 00:08:57.040
So let's follow the same philosophy,
where let's document
00:08:57.040 --> 00:09:00.160
these operations that we're going to
perform.
00:09:00.160 --> 00:09:04.560
I'm dropping in a
00:09:04.560 --> 00:09:07.112
a build instruction section
00:09:07.112 --> 00:09:13.360
and a run instruction section.
00:09:13.360 --> 00:09:15.279
As you can see here, we have a little
00:09:15.279 --> 00:09:17.839
a bash source block,
00:09:17.839 --> 00:09:19.245
and another bash source block.
00:09:19.245 --> 00:09:21.812
This one compiles. The go build command
00:09:21.812 --> 00:09:25.440
is what compiles a file. Then
00:09:25.440 --> 00:09:26.579
the file that gets generated
00:09:26.579 --> 00:09:30.080
should be called demo.
00:09:30.080 --> 00:09:32.412
So we just run it here.
00:09:32.412 --> 00:09:37.839
If I type C-c C-c, we get an
empty results block.
00:09:37.839 --> 00:09:38.979
When you compile things,
00:09:38.979 --> 00:09:41.360
no news is good news.
00:09:41.360 --> 00:09:43.012
It means there's no errors
00:09:43.012 --> 00:09:45.912
So presumably, we've created
00:09:45.912 --> 00:09:48.000
an executable that's called demo.
00:09:51.440 --> 00:09:53.312
Let's look again at the file system
00:09:53.312 --> 00:10:02.480
and regenerate...
00:10:02.480 --> 00:10:06.479
Yep. What we have here is a demo
executable,
00:10:06.479 --> 00:10:07.760
which is exactly what we
wanted.
00:10:07.760 --> 00:10:12.079
Let's go back.
00:10:12.079 --> 00:10:14.160
Now we should be able to run it.
00:10:14.160 --> 00:10:16.079
C-c C-c,
00:10:16.079 --> 00:10:20.399
and we get Hello World as a result,
00:10:20.399 --> 00:10:23.440
which was exactly what we were expecting.
00:10:23.440 --> 00:10:26.560
So that's already pretty cool.
00:10:26.560 --> 00:10:30.839
You can do that much.
00:10:33.040 --> 00:10:34.560
That's really just the tip of
00:10:34.560 --> 00:10:37.839
the iceberg. To really
00:10:41.040 --> 00:10:43.440
use the more impressive features of
00:10:43.440 --> 00:10:46.160
literate programming,
00:10:46.160 --> 00:10:49.920
we need to do a little bit more
00:10:53.200 --> 00:10:54.512
at least. Really,
00:10:54.512 --> 00:10:56.480
to get the full benefit of it,
00:10:56.480 --> 00:11:01.079
we need to add some sections
00:11:01.079 --> 00:11:04.412
that will cause Emacs to have to
00:11:04.412 --> 00:11:06.720
tangle or assemble
00:11:06.720 --> 00:11:09.760
this file from different pieces.
00:11:09.760 --> 00:11:13.120
Imagine that we wanted to take this file
00:11:13.120 --> 00:11:16.720
and maybe kind of templatize it.
00:11:16.720 --> 00:11:19.120
So, using literature programming syntax,
00:11:19.120 --> 00:11:21.279
this angle bracket syntax,
00:11:21.279 --> 00:11:24.399
let's say that we want to create an
00:11:24.399 --> 00:11:29.360
imports section,
00:11:29.360 --> 00:11:32.399
a functions section,
00:11:32.399 --> 00:11:35.040
and then maybe just a main section.
00:11:35.040 --> 00:11:36.240
We'll get rid of this.
00:11:36.240 --> 00:11:37.920
So now you see, we've created something
00:11:37.920 --> 00:11:39.760
that looks a little bit like a
00:11:39.760 --> 00:11:42.880
template or a scaffolding or outline
00:11:42.880 --> 00:11:45.812
for what our file is going to be.
00:11:45.812 --> 00:11:48.399
It looks a little bit like pseudocode.
00:11:48.399 --> 00:11:50.612
What we're going to have
00:11:50.612 --> 00:11:52.399
literate programming do
00:11:52.399 --> 00:11:54.800
is dynamically insert those things into
00:11:54.800 --> 00:11:56.639
those slots.
00:11:56.639 --> 00:12:00.079
So the first thing we need to do
00:12:00.079 --> 00:12:03.200
is... So let's create a section
00:12:03.200 --> 00:12:08.079
called "Say Hello."
00:12:08.079 --> 00:12:09.519
We want to add some functionality that
00:12:09.519 --> 00:12:12.720
makes our program say hello.
00:12:12.720 --> 00:12:15.680
So using a different snippet that I have
00:12:15.680 --> 00:12:17.600
for creating something
00:12:17.600 --> 00:12:20.800
that I call like a literate section,
00:12:20.800 --> 00:12:24.079
basically, we create a
00:12:24.079 --> 00:12:26.000
another source block that's almost the
00:12:26.000 --> 00:12:27.839
same as the one for the file.
00:12:27.839 --> 00:12:29.412
It just has a few differences
00:12:29.412 --> 00:12:34.079
Say we want to drop code into the import
section
00:12:34.079 --> 00:12:36.639
and we want it to be in Go.
00:12:36.639 --> 00:12:40.720
Here we use the same :noweb no-export syntax,
00:12:40.720 --> 00:12:44.560
but then we've added this :noweb-ref imports,
00:12:44.560 --> 00:12:48.240
and this ties that slot
00:12:48.240 --> 00:12:51.120
to this reference. It tells
00:12:51.120 --> 00:12:53.760
Emacs that when you tangle,
00:12:53.760 --> 00:12:55.479
we want to stick whatever's in here
00:12:55.479 --> 00:12:58.240
in that spot.
00:12:58.240 --> 00:13:02.079
You skip the tangle file name section
00:13:02.079 --> 00:13:03.279
because you're not actually creating a
00:13:03.279 --> 00:13:04.240
file name.
00:13:04.240 --> 00:13:06.160
You're putting information into an
00:13:06.160 --> 00:13:07.680
existing file.
00:13:07.680 --> 00:13:10.720
So here, we would just add the "fmt"
00:13:10.720 --> 00:13:14.399
for the imports.
00:13:14.399 --> 00:13:16.145
Let's add another section
00:13:16.145 --> 00:13:22.240
for functions.
00:13:22.240 --> 00:13:23.812
Let's just create a function
00:13:23.812 --> 00:13:28.079
called sayHello
00:13:28.079 --> 00:13:31.745
that doesn't have any arguments.
00:13:31.745 --> 00:13:34.000
No return types.
00:13:34.000 --> 00:13:35.760
All it does is pretty much the
00:13:35.760 --> 00:13:37.440
same thing as we did before:
00:13:37.440 --> 00:13:38.479
just print something.
00:13:38.479 --> 00:13:45.760
Let's just say "Hello EmacsConf"
this time.
00:13:45.760 --> 00:13:47.279
Now we have a function,
00:13:47.279 --> 00:13:50.779
and now the function won't do anything
00:13:50.779 --> 00:13:52.720
unless we invoke it. Let's do
00:13:52.720 --> 00:13:56.000
one last literate section
00:13:56.000 --> 00:13:59.920
called main. Make that Go
00:13:59.920 --> 00:14:03.519
source block. Then let's
00:14:03.519 --> 00:14:10.320
invoke that function.
00:14:10.320 --> 00:14:13.360
Now you can see that we've got
00:14:13.360 --> 00:14:15.600
our scaffolding
00:14:15.600 --> 00:14:17.199
outline, and then we have
00:14:17.199 --> 00:14:20.079
the sections that we want to get tangled
00:14:20.079 --> 00:14:21.360
or inserted.
00:14:21.360 --> 00:14:25.440
I've used this syntax.
00:14:25.440 --> 00:14:27.199
It's kinda borrowed from
00:14:27.199 --> 00:14:28.479
literate programming a little bit
00:14:28.479 --> 00:14:30.320
with a +=, so really it's just saying
00:14:30.320 --> 00:14:32.480
that I want to append
00:14:32.480 --> 00:14:35.760
this item into the import section
00:14:35.760 --> 00:14:37.600
It's really just to make a little bit
00:14:37.600 --> 00:14:39.839
more clear what's going on.
00:14:39.839 --> 00:14:41.445
When you generate documentation,
00:14:41.445 --> 00:14:43.519
you won't see these
00:14:43.519 --> 00:14:46.979
particular property annotations,
00:14:46.979 --> 00:14:50.145
and so you won't know immediately
00:14:50.145 --> 00:14:51.779
that this section goes in the
00:14:51.779 --> 00:14:53.839
imports area. So I usually put
00:14:53.839 --> 00:14:55.440
a little bit of documentation on top
00:14:55.440 --> 00:14:57.760
there, so that it's easy to see.
00:14:57.760 --> 00:15:01.120
You would, probably, if this was very
00:15:01.120 --> 00:15:03.040
complicated, you'd put some
00:15:03.040 --> 00:15:06.245
documentation above to explain
00:15:06.245 --> 00:15:07.360
what you were doing,
00:15:07.360 --> 00:15:11.519
maybe right here.
00:15:11.519 --> 00:15:13.279
You could picture yourself
00:15:13.279 --> 00:15:15.040
maybe explaining
00:15:15.040 --> 00:15:16.745
a complicated algorithm
00:15:16.745 --> 00:15:18.079
or something up here
00:15:18.079 --> 00:15:21.120
and having a nice way to document it.
00:15:21.120 --> 00:15:22.959
So now that we've got that here in the
00:15:22.959 --> 00:15:25.600
documentation, we need to figure out...
00:15:25.600 --> 00:15:27.040
We need to make sure that it's going to
00:15:27.040 --> 00:15:28.045
tangle properly.
00:15:28.045 --> 00:15:33.519
Your best friend at this point
00:15:33.519 --> 00:15:35.680
is a keyboard shortcut that lets you
00:15:35.680 --> 00:15:37.945
preview the tangled operation.
00:15:37.945 --> 00:15:42.560
If you say C-c C-v C-v,
00:15:42.560 --> 00:15:44.079
it will create a new buffer
00:15:44.079 --> 00:15:47.212
with the tangled contents
00:15:47.212 --> 00:15:49.179
and so you can see here
00:15:49.179 --> 00:15:52.345
that the fmt import went to the right
place,
00:15:52.345 --> 00:15:54.679
that function went to the right place,
00:15:54.679 --> 00:15:56.079
the function invocation went to
00:15:56.079 --> 00:15:58.480
the right place. We're feeling good.
00:15:58.480 --> 00:16:00.912
You can nest these things
00:16:00.912 --> 00:16:02.800
many layers deep.
00:16:02.800 --> 00:16:06.045
If you came into the sayHello function,
00:16:06.045 --> 00:16:10.560
you could add more sections.
00:16:10.560 --> 00:16:13.759
It'll go through and it'll
00:16:13.759 --> 00:16:15.345
keep track of all that
00:16:15.345 --> 00:16:16.212
and tangle it for you
00:16:16.212 --> 00:16:16.959
so you really get a lot of freedom
00:16:16.959 --> 00:16:18.320
and flexibility for how you want to
00:16:18.320 --> 00:16:20.479
document things by doing this.
00:16:20.479 --> 00:16:23.079
So now that we've previewed it
00:16:23.079 --> 00:16:25.839
and we feel good about it,
00:16:25.839 --> 00:16:28.639
we need to tangle so
00:16:28.639 --> 00:16:31.440
we get the file on the file system.
00:16:31.440 --> 00:16:34.979
so C-c C-c and get...
00:16:34.979 --> 00:16:37.199
just main.go comes back again.
00:16:37.199 --> 00:16:40.959
C-c C-cc and no errors come back.
00:16:40.959 --> 00:16:43.279
Then if we did this right,
00:16:43.279 --> 00:16:45.079
when we run this, we should get
00:16:45.079 --> 00:16:45.600
"Hello, EmacsConf."
00:16:45.600 --> 00:16:51.199
So C-c C-c, Hello EmacsConf.
00:16:54.800 --> 00:16:57.645
I think that's pretty, pretty cool,
actually.
00:16:57.645 --> 00:16:59.579
So we've got the breadcrumbs
00:16:59.579 --> 00:17:01.212
of the process we've gone through
00:17:01.212 --> 00:17:02.399
to get to this point,
00:17:02.399 --> 00:17:07.545
this initial document that has some
tangling in it.
00:17:07.545 --> 00:17:09.919
We have documentation for how to tangle,
00:17:09.919 --> 00:17:11.345
how to build, how to run.
00:17:11.345 --> 00:17:15.045
We've really built a nice foundation
00:17:15.045 --> 00:17:19.379
for moving forward on our project
00:17:19.379 --> 00:17:21.439
and a nice way of breaking things
out
00:17:21.439 --> 00:17:23.280
and documenting further.
00:17:23.280 --> 00:17:27.120
The last piece that we need to
00:17:27.120 --> 00:17:30.559
take care of is the weave that
00:17:30.559 --> 00:17:34.799
I showed you in the diagram above.
00:17:34.799 --> 00:17:38.640
So one more time, we'll drop in
00:17:38.640 --> 00:17:41.760
some documentation, this time on how
00:17:41.760 --> 00:17:42.400
to weave.
00:17:42.400 --> 00:17:44.400
It's really just an export function.
00:17:44.400 --> 00:17:46.245
it's not... There's not a separate
00:17:46.245 --> 00:17:49.012
weave command going on here.
00:17:49.012 --> 00:17:50.640
we're just going to export
00:17:50.640 --> 00:17:53.512
what we've got here into a Markdown
format.
00:17:53.512 --> 00:17:57.045
We're using org-gfm-export-to-markdown,
00:17:57.045 --> 00:17:59.745
which is the Github style markdown.
00:17:59.745 --> 00:18:02.160
You can use the other,
00:18:02.160 --> 00:18:03.812
more standard type as well.
00:18:03.812 --> 00:18:08.479
Hit C-c C-c. Now you see
00:18:08.479 --> 00:18:11.312
we've got a README file,
00:18:11.312 --> 00:18:16.512
and if you look in the file system,
00:18:16.512 --> 00:18:19.120
we've got that right there.
00:18:19.120 --> 00:18:23.120
If you go to something like ghostwriter
00:18:23.120 --> 00:18:31.679
and open that file,
00:18:31.679 --> 00:18:32.879
now you can see that
00:18:32.879 --> 00:18:35.520
it's generated some documentation.
00:18:35.520 --> 00:18:37.645
It puts a index at top at the top.
00:18:39.679 --> 00:18:41.145
I usually turn that off.
00:18:41.145 --> 00:18:42.379
It's easy to do that by
00:18:42.379 --> 00:18:43.179
putting a property at the
00:18:43.179 --> 00:18:46.145
top of your Org file,
00:18:46.145 --> 00:18:46.880
but some people like to
00:18:46.880 --> 00:18:48.559
have an index.
00:18:48.559 --> 00:18:50.799
Here you can see that it has generated
00:18:50.799 --> 00:18:55.200
pretty nicely and formatted
snippets well,
00:18:55.200 --> 00:18:56.880
put the diagram in there, and then
00:18:58.240 --> 00:19:02.799
it's preserved this
literate programming syntax,
00:19:02.799 --> 00:19:04.960
which is important because that's how we
00:19:04.960 --> 00:19:06.112
want to view the documentation.
00:19:06.112 --> 00:19:11.312
That's what the no-exports property
00:19:11.312 --> 00:19:13.360
was trying to maintain.
00:19:13.360 --> 00:19:15.979
no-exports means when you export,
00:19:15.979 --> 00:19:18.400
do not try to tangle.
00:19:18.400 --> 00:19:20.559
Hopefully that makes more sense now.
00:19:20.559 --> 00:19:22.240
Now you can see all the documentation.
00:19:22.240 --> 00:19:26.080
I think it demonstrates a
00:19:26.080 --> 00:19:33.520
pretty useful feature that's inside of
Emacs.
00:19:33.520 --> 00:19:34.979
Hopefully you'll have as much fun
00:19:34.979 --> 00:19:39.919
using that as I have.
00:19:39.919 --> 00:19:43.600
So thanks!