summaryrefslogblamecommitdiffstats
path: root/2020/subtitles/emacsconf-2020--14-readme-driven-design--adam-ard-autogen.sbv
blob: 506a26eb88be2169cd809439170d0807b2e7c040 (plain) (tree)
1
2
3
4
5



                       
                                        





































                                        
                                       





































                                        
                                       

                       
                                










                                        
                                      






















                                        
                                        























































                                       
                     

                       
                                        




                            
                                



































































                                        
                                       




























                                       
                                        




















































                                        
                                  







                                
                                    













                                      
                                       














































                                        
                          































                                      
                                  



































































                                        
                                     













                                      
                                       




                                        
                                

                       
                                   




                                    
                                       

                       
                                      







                                        
                         










































































































                                        
                    




























                                       
                                        

































































































                                        
                                      















































































                                        
                                        




                       
                                   








































                                        
                          


























































                                        
                    








































                                        
                                  










                                        
                     

























                                     
                                     























































































































































                                        
                    

                       
                       

                       
       

                       
                                 








































                                        
                                

                       
                                        
































































                                        
                                   




                       
                                       
































































                                        
                             




                                      
                       




                                       
              



                       
0:00:03.600,0:00:06.560
hello

0:00:04.400,0:00:08.400
welcome to readme driven design in Emacs

0:00:06.560,0:00:10.800
by adam aard

0:00:08.400,0:00:12.559
if you're a programmer you're accustomed

0:00:10.800,0:00:13.759
to putting a readme file at the root of

0:00:12.559,0:00:16.400
your project

0:00:13.759,0:00:17.600
and it's usually a markdown file but if

0:00:16.400,0:00:20.720
you use an org

0:00:17.600,0:00:22.560
more an org mode file instead you can

0:00:20.720,0:00:24.400
take advantage of the great features

0:00:22.560,0:00:25.920
that org mode provides including

0:00:24.400,0:00:28.000
literate programming

0:00:25.920,0:00:31.840
which lets you generate your source code

0:00:28.000,0:00:34.719
and markdown documentation dynamically

0:00:31.840,0:00:37.120
I want to walk you through a little bit

0:00:34.719,0:00:39.440
of what this looks like

0:00:37.120,0:00:41.280
when you start a project especially if

0:00:39.440,0:00:43.320
if you use something like github you

0:00:41.280,0:00:47.039
begin with an automatically generated

0:00:43.320,0:00:50.239
readme.md file so just delete that

0:00:47.039,0:00:51.920
and instead create a readme.org file

0:00:50.239,0:00:54.800
starting with an empty org file like you

0:00:51.920,0:00:56.559
see here you can begin

0:00:54.800,0:00:59.440
by recording important information about

0:00:56.559,0:01:01.920
your project goals you can add diagrams

0:00:59.440,0:01:03.520
code snippets to-do lists time tracking

0:01:01.920,0:01:05.360
and much more

0:01:03.520,0:01:07.760
I'm going to drop in some documentation

0:01:05.360,0:01:10.840
that I r that I've written about

0:01:07.760,0:01:12.240
about my project here so you can kind of

0:01:10.840,0:01:15.280
see

0:01:12.240,0:01:17.119
what this would look like

0:01:15.280,0:01:20.320
so as you can see I have a title and a

0:01:17.119,0:01:23.840
description and then a sub section

0:01:20.320,0:01:25.520
as well as some code snippets

0:01:23.840,0:01:28.240
and you can see that orgmo does a great

0:01:25.520,0:01:31.280
job of formatting lists and

0:01:28.240,0:01:33.920
code sections diagrams and so forth

0:01:31.280,0:01:35.040
it's good or it's as good or better than

0:01:33.920,0:01:37.520
markdown

0:01:35.040,0:01:38.880
but when you use it in the Emacs you can

0:01:37.520,0:01:40.479
do a lot more

0:01:38.880,0:01:43.360
for example you can dynamically create

0:01:40.479,0:01:45.200
diagrams using graphviz

0:01:43.360,0:01:46.560
from a text description so if you go to

0:01:45.200,0:01:49.439
this source block here

0:01:46.560,0:01:51.439
and hit control c control c you'll see

0:01:49.439,0:01:55.439
that we generate a

0:01:51.439,0:01:59.200
diagram dynamically you can run

0:01:55.439,0:02:00.799
so you can run these code snippets in

0:01:59.200,0:02:03.040
place and get the results

0:02:00.799,0:02:06.640
to show up inside of your your file

0:02:03.040,0:02:06.640
which is a really powerful paradigm

0:02:08.000,0:02:11.520
but most important most importantly for

0:02:10.640,0:02:14.800
the

0:02:11.520,0:02:17.200
purposes my purpose is here

0:02:14.800,0:02:19.520
orgmo provides you the ability to do

0:02:17.200,0:02:21.440
literate programming

0:02:19.520,0:02:23.200
so take a quick look at this diagram

0:02:21.440,0:02:25.360
that I generated here

0:02:23.200,0:02:27.520
and gives you a quick overview of what I

0:02:25.360,0:02:31.200
mean by literate programming

0:02:27.520,0:02:33.920
and how I'm using it you can see

0:02:31.200,0:02:34.720
that we start with a readme.org file on

0:02:33.920,0:02:36.879
top

0:02:34.720,0:02:37.920
at this point we can do one of two

0:02:36.879,0:02:41.280
things

0:02:37.920,0:02:42.720
tangle or weave tangle is used to

0:02:41.280,0:02:46.319
describe the process of

0:02:42.720,0:02:47.599
generating source code while weave

0:02:46.319,0:02:49.840
is the process of generating

0:02:47.599,0:02:51.920
documentation these are terms that

0:02:49.840,0:02:53.840
donald knuth used

0:02:51.920,0:02:55.519
and he's the one that came up with the

0:02:53.840,0:02:59.920
idea of literate programming

0:02:55.519,0:03:01.519
in the early 1980s

0:02:59.920,0:03:04.480
but this is really all that there is to

0:03:01.519,0:03:06.400
it you just

0:03:04.480,0:03:07.840
who are simply using literate illiterate

0:03:06.400,0:03:10.319
source file

0:03:07.840,0:03:11.680
in this case the readme.org to generate

0:03:10.319,0:03:15.680
the rest of the project

0:03:11.680,0:03:15.680
the rest of the project files basically

0:03:17.120,0:03:22.640
so let's dig in to the details of how

0:03:20.959,0:03:24.560
this works

0:03:22.640,0:03:26.159
and I hope you hopefully you'll see how

0:03:24.560,0:03:28.959
cool this is

0:03:26.159,0:03:31.120
so returning to the file here let's

0:03:28.959,0:03:32.080
assume we have enough documentation now

0:03:31.120,0:03:34.159
that we want to get started

0:03:32.080,0:03:35.519
coding so maybe we'll just start with

0:03:34.159,0:03:38.159
like a hello world

0:03:35.519,0:03:41.519
app just so we can make sure that our

0:03:38.159,0:03:47.120
environment is set up correctly

0:03:41.519,0:03:49.519
so let's get started with a code block

0:03:47.120,0:03:50.319
so I created a little snippet to help me

0:03:49.519,0:03:52.239
add

0:03:50.319,0:03:53.599
a source block for literate programming

0:03:52.239,0:03:56.959
quickly

0:03:53.599,0:03:58.799
and there's not much to it

0:03:56.959,0:04:01.599
but there is some important annotations

0:03:58.799,0:04:04.080
here so there's

0:04:01.599,0:04:05.200
excuse me there's a there's a property

0:04:04.080,0:04:09.360
called tangle

0:04:05.200,0:04:13.280
and that takes a value of a file name

0:04:09.360,0:04:16.560
and then there's also a no web property

0:04:13.280,0:04:16.560
called no export

0:04:18.880,0:04:22.000
and basically

0:04:23.759,0:04:28.639
basically the no export will explain

0:04:26.800,0:04:32.080
that a little bit

0:04:28.639,0:04:33.919
more later um it has has to do with how

0:04:32.080,0:04:37.600
the tangling

0:04:33.919,0:04:39.280
is uh done in the tangle step versus the

0:04:37.600,0:04:41.199
weave step and I'll explain that a

0:04:39.280,0:04:45.199
little bit more but the tangle

0:04:41.199,0:04:48.320
field just simply tells tells uh

0:04:45.199,0:04:50.320
Emacs where it needs to generate the

0:04:48.320,0:04:53.280
main.go file and where it needs to put

0:04:50.320,0:04:53.280
it on the file system

0:04:55.360,0:04:59.040
uh you'll you'll notice that we we're

0:04:57.680,0:05:01.440
going to use go

0:04:59.040,0:05:02.160
that's just the language that I've been

0:05:01.440,0:05:05.360
using

0:05:02.160,0:05:07.360
the most lately uh but

0:05:05.360,0:05:08.400
this programming strategy is language

0:05:07.360,0:05:12.080
agnostic

0:05:08.400,0:05:14.720
you could use any language or any mix

0:05:12.080,0:05:16.560
of languages you could create some files

0:05:14.720,0:05:19.520
in python some files and go

0:05:16.560,0:05:21.520
some files in in lisp or whatever you

0:05:19.520,0:05:24.720
want

0:05:21.520,0:05:28.000
and so but let's

0:05:24.720,0:05:29.440
uh let's create just a little hello

0:05:28.000,0:05:32.320
world

0:05:29.440,0:05:33.520
let's use another snippet here to

0:05:32.320,0:05:36.560
generate

0:05:33.520,0:05:39.840
the basics of a go program

0:05:36.560,0:05:39.840
so I'm just going to print

0:05:40.240,0:05:42.960
hello world

0:05:44.960,0:05:48.240
so that's and then

0:05:48.560,0:05:55.280
let's make it a section in our

0:05:52.320,0:05:56.400
file so now you can see we've got this

0:05:55.280,0:05:59.600
snippet

0:05:56.400,0:06:01.600
um when you have a source block in

0:05:59.600,0:06:02.880
inside of org mode you can easily pop

0:06:01.600,0:06:04.960
into a

0:06:02.880,0:06:07.680
language specific buffer by typing

0:06:04.960,0:06:10.240
control c single quote

0:06:07.680,0:06:12.160
so you can see now I have a a go a

0:06:10.240,0:06:14.240
buffer that's in go mode

0:06:12.160,0:06:15.520
and gives you all the ability to edit

0:06:14.240,0:06:18.800
like you would

0:06:15.520,0:06:20.800
normally if you hit ctrl c

0:06:18.800,0:06:22.639
single quote again then it goes back and

0:06:20.800,0:06:25.280
any changes you

0:06:22.639,0:06:26.160
make would will be updated there but you

0:06:25.280,0:06:28.000
can do quite a bit

0:06:26.160,0:06:29.199
just inside of here too there's quite a

0:06:28.000,0:06:32.400
bit of

0:06:29.199,0:06:32.400
language specific

0:06:33.360,0:06:36.880
functionality just in place and so you

0:06:35.440,0:06:38.080
don't always have to go over to a

0:06:36.880,0:06:42.319
separate buffer

0:06:38.080,0:06:44.319
but it's a it's a nice option sometimes

0:06:42.319,0:06:46.720
but now that you have the code in here

0:06:44.319,0:06:48.560
you're going to want to run it

0:06:46.720,0:06:50.240
but right now it just lives here in this

0:06:48.560,0:06:52.160
documentation

0:06:50.240,0:06:53.840
so you need to get a copy of it into a

0:06:52.160,0:06:57.440
separate file

0:06:53.840,0:07:01.360
and that's the tangle process that you

0:06:57.440,0:07:03.360
you need to follow there so I'm gonna

0:07:01.360,0:07:05.280
drop in a little bit more doc a little

0:07:03.360,0:07:08.960
bit more

0:07:05.280,0:07:08.960
documentation really quick here

0:07:12.240,0:07:21.520
okay all right so just kind of as a

0:07:17.360,0:07:24.800
kind of as a side note I like to follow

0:07:21.520,0:07:26.639
this process uh whenever having whenever

0:07:24.800,0:07:28.880
I have an operation to perform I

0:07:26.639,0:07:31.680
I'd like to document it here with a

0:07:28.880,0:07:33.280
snippet that can be executed in line

0:07:31.680,0:07:34.639
then I don't have to leave org mode and

0:07:33.280,0:07:36.800
I don't have to try to remember what I

0:07:34.639,0:07:38.960
did later so instead of just

0:07:36.800,0:07:40.319
trying to do an operation the first time

0:07:38.960,0:07:41.680
I do something I take the

0:07:40.319,0:07:43.440
take the time to figure out what it is

0:07:41.680,0:07:44.879
and document it and so then it's

0:07:43.440,0:07:48.400
recorded

0:07:44.879,0:07:49.120
and so here we find that to do a tangle

0:07:48.400,0:07:51.680
operation

0:07:49.120,0:07:52.560
you run the command or babel tangled

0:07:51.680,0:07:55.840
which is a

0:07:52.560,0:07:59.199
e-list command so if you hit ctrl c

0:07:55.840,0:08:00.080
ctrl c to run it in place you get the

0:07:59.199,0:08:02.720
result

0:08:00.080,0:08:03.759
of main dot go which basically is

0:08:02.720,0:08:07.680
telling us that

0:08:03.759,0:08:11.039
we've tangled one file called main.go

0:08:07.680,0:08:14.000
and you can see that that's true

0:08:11.039,0:08:14.400
if you go to the file system and you

0:08:14.000,0:08:17.840
look

0:08:14.400,0:08:20.960
so now in uh in our demo directory

0:08:17.840,0:08:22.479
we have a readme.org we have that png

0:08:20.960,0:08:23.440
that we generated but we also have a

0:08:22.479,0:08:26.080
main.go

0:08:23.440,0:08:27.759
and if you if you visit that file you'll

0:08:26.080,0:08:29.280
see that it's just the source code that

0:08:27.759,0:08:31.039
was in our documentation which is

0:08:29.280,0:08:32.880
exactly what we expected and what we

0:08:31.039,0:08:36.000
wanted so that's good

0:08:32.880,0:08:36.000
so if we return to

0:08:36.560,0:08:39.919
to where we are at

0:08:41.120,0:08:44.640
now we're we're at the point where we

0:08:42.959,0:08:45.760
have a file on the file system so now we

0:08:44.640,0:08:48.959
need

0:08:45.760,0:08:53.600
um now we need to build it and to

0:08:48.959,0:08:57.040
run it so let's follow the same

0:08:53.600,0:08:58.720
philosophy where let's document

0:08:57.040,0:09:00.160
these operations that we're going to

0:08:58.720,0:09:03.920
perform

0:09:00.160,0:09:03.920
so I'm dropping in a

0:09:04.560,0:09:11.200
a build instruction section and a run

0:09:07.839,0:09:11.200
instruction section

0:09:13.360,0:09:17.839
so as you can see here we have a little

0:09:15.279,0:09:20.000
a bash source block

0:09:17.839,0:09:22.000
and another batch source block this one

0:09:20.000,0:09:25.440
compiles the go build command is what

0:09:22.000,0:09:26.880
compiles a file and then

0:09:25.440,0:09:29.519
the file that gets generated should be

0:09:26.880,0:09:29.519
called demo

0:09:30.080,0:09:34.000
and uh so we just run it here so if if I

0:09:32.959,0:09:37.839
type control c

0:09:34.000,0:09:40.640
control c we get an empty results block

0:09:37.839,0:09:41.360
when you compile things no news is good

0:09:40.640,0:09:44.399
news

0:09:41.360,0:09:46.560
so it means there's no errors so

0:09:44.399,0:09:48.000
presumably we've created an executable

0:09:46.560,0:09:51.440
that's called demo

0:09:48.000,0:09:54.560
so let's uh

0:09:51.440,0:09:57.519
let's look again at the file system and

0:09:54.560,0:09:57.519
regenerate

0:10:02.480,0:10:07.200
yep and what we have here is a demo

0:10:05.760,0:10:07.760
executable which is exactly what we

0:10:07.200,0:10:12.079
wanted

0:10:07.760,0:10:14.160
so let's go back

0:10:12.079,0:10:16.079
so now we should be able to run it so

0:10:14.160,0:10:20.320
ctrl c ctrl c

0:10:16.079,0:10:20.320
and we get hello world as a result

0:10:20.399,0:10:26.560
which was exactly what we were expecting

0:10:23.440,0:10:30.240
so that's already pretty cool

0:10:26.560,0:10:30.240
you can you can do that much

0:10:30.839,0:10:34.560
um but

0:10:33.040,0:10:37.839
that's really just kind of the tip of

0:10:34.560,0:10:41.040
the iceberg to uh to really

0:10:37.839,0:10:43.440
kind of um

0:10:41.040,0:10:46.160
use the more impressive features of

0:10:43.440,0:10:49.519
literate programming we need to uh

0:10:46.160,0:10:49.519
we need to do a little bit more

0:10:49.920,0:10:55.519
so or at least

0:10:53.200,0:10:56.480
at least really to get the full benefit

0:10:55.519,0:10:59.120
of it then

0:10:56.480,0:10:59.120
we need to do

0:10:59.600,0:11:06.320
add some sections that will cause uh

0:11:02.959,0:11:06.720
Emacs to have to to tangle or assemble

0:11:06.320,0:11:09.760
this

0:11:06.720,0:11:13.120
this file from different pieces so

0:11:09.760,0:11:16.720
imagine that we wanted to take this file

0:11:13.120,0:11:19.120
and maybe kind of templatize it

0:11:16.720,0:11:21.279
so using literature programming syntax

0:11:19.120,0:11:24.399
this angle bracket syntax

0:11:21.279,0:11:29.360
let's say that we want to create an in

0:11:24.399,0:11:32.399
imports section

0:11:29.360,0:11:35.040
in a functions section

0:11:32.399,0:11:36.240
and then maybe just a main section and

0:11:35.040,0:11:37.920
we'll get rid of this

0:11:36.240,0:11:39.760
so now you see we've created something

0:11:37.920,0:11:42.000
that looks a little bit like a

0:11:39.760,0:11:42.880
like a template or a scaffolding or

0:11:42.000,0:11:46.000
outline

0:11:42.880,0:11:48.399
for what what our file is going to be it

0:11:46.000,0:11:50.800
looks a little bit like pseudocode

0:11:48.399,0:11:52.399
and what we're going to have literate

0:11:50.800,0:11:54.800
programming do

0:11:52.399,0:11:56.639
is dynamically insert those things into

0:11:54.800,0:12:00.079
those slots

0:11:56.639,0:12:03.200
so the first thing we need to do

0:12:00.079,0:12:08.079
is so let's create a section

0:12:03.200,0:12:09.519
maybe called say hello so we want

0:12:08.079,0:12:12.720
we want to add some functionality that

0:12:09.519,0:12:15.680
makes our program say hello

0:12:12.720,0:12:17.600
so using a different snippet that I have

0:12:15.680,0:12:20.800
for creating something

0:12:17.600,0:12:24.079
that I call like a literate section

0:12:20.800,0:12:26.000
um basically we create a

0:12:24.079,0:12:27.839
another source block that's almost the

0:12:26.000,0:12:31.040
same as the one for the file but it's

0:12:27.839,0:12:31.680
it just has a few differences so say we

0:12:31.040,0:12:34.160
want to

0:12:31.680,0:12:36.639
drop code into the import section and we

0:12:34.160,0:12:39.120
want it to be in go

0:12:36.639,0:12:40.720
here we use the same noed no web no

0:12:39.120,0:12:43.200
export syntax

0:12:40.720,0:12:44.560
but then we've added this no web refs

0:12:43.200,0:12:48.240
imports

0:12:44.560,0:12:51.120
and this ties that slot

0:12:48.240,0:12:53.760
basically to this reference it tells

0:12:51.120,0:12:56.880
Emacs that when you tangle

0:12:53.760,0:12:58.240
we want to stick whatever's in here in

0:12:56.880,0:13:02.079
that spot

0:12:58.240,0:13:03.279
so you skip the tangle file name section

0:13:02.079,0:13:04.240
because you're not actually creating a

0:13:03.279,0:13:06.160
file name you're

0:13:04.240,0:13:07.680
you're putting information into an

0:13:06.160,0:13:10.720
existing file

0:13:07.680,0:13:13.680
so here we would just add the fmt

0:13:10.720,0:13:13.680
for the imports

0:13:14.399,0:13:22.240
so let's add another section for uh

0:13:18.839,0:13:25.519
functions and let's create a

0:13:22.240,0:13:30.240
let's just create a function called

0:13:25.519,0:13:32.839
say hello that

0:13:30.240,0:13:34.000
doesn't have any arguments no return

0:13:32.839,0:13:35.760
types

0:13:34.000,0:13:37.440
all it does is kind of pretty much the

0:13:35.760,0:13:39.199
same thing as we did before

0:13:37.440,0:13:41.360
just print something but let's just say

0:13:39.199,0:13:45.760
hello

0:13:41.360,0:13:49.519
Emacs comp this time

0:13:45.760,0:13:51.040
okay so now we have a function and now

0:13:49.519,0:13:52.720
the function won't do anything unless we

0:13:51.040,0:13:56.000
invoke it so let's do

0:13:52.720,0:13:59.920
one last literate section

0:13:56.000,0:14:03.519
called main make that go

0:13:59.920,0:14:06.399
source block and then let's

0:14:03.519,0:14:06.399
just invoke

0:14:06.560,0:14:13.360
that that function

0:14:10.320,0:14:15.600
so now you can see that we've got

0:14:13.360,0:14:17.199
our scaffolding scaffolding kind of

0:14:15.600,0:14:20.079
outline and then we have

0:14:17.199,0:14:21.360
the sections that we want to get tangled

0:14:20.079,0:14:25.440
or inserted

0:14:21.360,0:14:27.199
so I I've kind of used this syntax

0:14:25.440,0:14:28.560
it's it's kind of borrowed from

0:14:27.199,0:14:30.320
literature programming a little bit with

0:14:28.560,0:14:32.480
a plus equals so really it's just saying

0:14:30.320,0:14:35.760
that I want to append

0:14:32.480,0:14:37.600
this item into the import section so

0:14:35.760,0:14:39.839
it's really just to make a little bit

0:14:37.600,0:14:41.519
more clear what's going on

0:14:39.839,0:14:43.519
when you generate documentation you

0:14:41.519,0:14:46.160
won't see these

0:14:43.519,0:14:49.360
these these particular property

0:14:46.160,0:14:51.440
annotations and so you won't know

0:14:49.360,0:14:53.839
immediately that this section goes in

0:14:51.440,0:14:55.440
the imports area and so I usually put

0:14:53.839,0:14:57.760
a little bit of documentation on top

0:14:55.440,0:15:01.120
there so that it's easy to see

0:14:57.760,0:15:03.040
and you would probably if this was very

0:15:01.120,0:15:06.399
complicated you'd put some

0:15:03.040,0:15:07.360
documentation above to explain what you

0:15:06.399,0:15:10.320
were doing

0:15:07.360,0:15:10.320
maybe right here

0:15:11.519,0:15:15.040
you could you could picture yourself

0:15:13.279,0:15:17.440
maybe explaining

0:15:15.040,0:15:18.079
a complicated algorithm or something up

0:15:17.440,0:15:21.120
here

0:15:18.079,0:15:22.959
and having a nice way to document it

0:15:21.120,0:15:25.600
so now that we've got that here in the

0:15:22.959,0:15:27.040
documentation we need to figure out

0:15:25.600,0:15:29.920
we need to make sure that it's going to

0:15:27.040,0:15:33.519
tangle properly so your best friend

0:15:29.920,0:15:35.680
at this point is is uh

0:15:33.519,0:15:38.240
is a keyboard shortcut that lets you

0:15:35.680,0:15:38.959
preview the tangled operation so if you

0:15:38.240,0:15:42.560
say control

0:15:38.959,0:15:45.120
c control v control v

0:15:42.560,0:15:46.480
it will create a new buffer with the

0:15:45.120,0:15:49.360
tangled

0:15:46.480,0:15:50.639
contents and so you can see here that

0:15:49.360,0:15:53.199
the fmt

0:15:50.639,0:15:54.720
import went to the right place that

0:15:53.199,0:15:56.160
function went to the right place the

0:15:54.720,0:15:58.480
function invocation went to the right

0:15:56.160,0:16:01.279
place and so we're feeling good

0:15:58.480,0:16:02.800
you can nest these things many layers

0:16:01.279,0:16:04.800
deep

0:16:02.800,0:16:07.199
actually so like if you came into the

0:16:04.800,0:16:10.160
say hello function you could add

0:16:07.199,0:16:10.160
more sections

0:16:10.560,0:16:13.759
you know and it gets and it'll go

0:16:12.160,0:16:15.680
through and it'll

0:16:13.759,0:16:16.959
keep track of all that and tangle it for

0:16:15.680,0:16:18.320
you so you really get a lot of freedom

0:16:16.959,0:16:19.600
and flexibility for how you want to

0:16:18.320,0:16:22.320
document things

0:16:19.600,0:16:25.839
by doing this so now that we've

0:16:22.320,0:16:28.639
previewed it and we feel good about it

0:16:25.839,0:16:31.440
we need to uh we need to tangle so we

0:16:28.639,0:16:34.480
get the file on the file system

0:16:31.440,0:16:37.199
so ctrl c ctrl c and

0:16:34.480,0:16:37.920
get just main.go comes back again

0:16:37.199,0:16:40.959
control c

0:16:37.920,0:16:43.839
control c and no errors come back

0:16:40.959,0:16:45.600
and then if we did this right when we

0:16:43.839,0:16:47.199
when we run this we should get hello

0:16:45.600,0:16:51.199
Emacs comp so ctrl c

0:16:47.199,0:16:54.800
ctrl c hello Emacs comp

0:16:51.199,0:16:57.120
so I uh

0:16:54.800,0:16:58.240
I think that's pretty pretty cool

0:16:57.120,0:17:00.160
actually so we've got

0:16:58.240,0:17:02.399
kind of the breadcrumbs of the process

0:17:00.160,0:17:05.520
we've gone through to get to this point

0:17:02.399,0:17:08.000
this initial this initial

0:17:05.520,0:17:09.919
document that has some tangling in it we

0:17:08.000,0:17:12.799
have documentation for how to tangle

0:17:09.919,0:17:14.079
how to build how to run it's we've

0:17:12.799,0:17:17.760
really built a nice

0:17:14.079,0:17:20.160
foundation for

0:17:17.760,0:17:21.439
moving forward on our project and a nice

0:17:20.160,0:17:23.280
way of breaking things out and

0:17:21.439,0:17:27.120
documenting further

0:17:23.280,0:17:30.559
the last piece that we need to

0:17:27.120,0:17:34.799
take care of is the weave that I

0:17:30.559,0:17:38.640
that's I showed you in the diagram above

0:17:34.799,0:17:41.760
so one more time we'll drop in

0:17:38.640,0:17:42.400
some documentation so this time on how

0:17:41.760,0:17:44.400
to weave

0:17:42.400,0:17:47.520
so it's really just an export function

0:17:44.400,0:17:49.280
it's not there's not a separate weave

0:17:47.520,0:17:50.640
command going on here we're just going

0:17:49.280,0:17:52.799
to export

0:17:50.640,0:17:55.200
what we've got here into a markdown

0:17:52.799,0:17:57.440
format so we're using org

0:17:55.200,0:17:58.880
gfm export to markdown which is the

0:17:57.440,0:18:02.160
github style

0:17:58.880,0:18:05.440
markdown you can use the other just

0:18:02.160,0:18:10.320
more standard type as well so hit ctrl c

0:18:05.440,0:18:15.280
ctrl c now you see we've got a readme

0:18:10.320,0:18:17.440
file and if you look

0:18:15.280,0:18:19.120
in the file system we've got that right

0:18:17.440,0:18:23.120
there and so

0:18:19.120,0:18:29.840
if you go to something like ghostwriter

0:18:23.120,0:18:29.840
and open that file

0:18:31.679,0:18:35.520
now you can see that it's generated some

0:18:34.559,0:18:38.320
documentation

0:18:35.520,0:18:39.679
it puts a index at top at the top I

0:18:38.320,0:18:42.000
usually just

0:18:39.679,0:18:43.679
I usually turn that off it's easy to do

0:18:42.000,0:18:44.559
that by putting a property at the top of

0:18:43.679,0:18:46.880
your

0:18:44.559,0:18:48.559
your org file but some people like to

0:18:46.880,0:18:50.799
have an index

0:18:48.559,0:18:52.160
but here you can see that it's generated

0:18:50.799,0:18:55.200
pretty nicely and

0:18:52.160,0:18:56.880
formatted snippets well

0:18:55.200,0:18:58.240
put the diagram in there and then it's

0:18:56.880,0:19:01.039
preserved

0:18:58.240,0:19:02.799
it's preserved this literate programming

0:19:01.039,0:19:04.960
syntax

0:19:02.799,0:19:06.480
which is important because that's how we

0:19:04.960,0:19:07.200
want to view the documentation that's

0:19:06.480,0:19:10.559
what the no

0:19:07.200,0:19:13.360
exports um

0:19:10.559,0:19:14.000
property was was trying to maintain so

0:19:13.360,0:19:16.080
that

0:19:14.000,0:19:18.400
no exports means when you export do not

0:19:16.080,0:19:20.559
try to tangle so that's

0:19:18.400,0:19:22.240
hopefully that makes more sense now but

0:19:20.559,0:19:26.080
now you can see all the documentation

0:19:22.240,0:19:29.919
and I think it demonstrates a

0:19:26.080,0:19:33.520
pretty useful feature that's inside of

0:19:29.919,0:19:35.039
Emacs and and hopefully

0:19:33.520,0:19:39.840
hopefully you'll have as much fun using

0:19:35.039,0:19:39.840
that as I have

0:19:39.919,0:19:43.600
so thanks