1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
|
<!-- Automatically generated by emacsconf-publish-after-page -->
<div class="transcript transcript-mainVideo"><a name="literate-mainVideo-transcript"></a>
# Transcript
[[!template new="1" text="""Introduction""" start="00:00:00.000" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Can you believe it's been a decade since I started""" start="00:00:00.000" video="mainVideo-literate" id="subtitle"]]
[[!template text="""pontificating on literate programming?""" start="00:00:09.360" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I am Howard Abrams. In 2015, I spoke at this EmacsConf""" start="00:00:12.359" video="mainVideo-literate" id="subtitle"]]
[[!template text="""where I described my challenges I called Literate DevOps.""" start="00:00:17.543" video="mainVideo-literate" id="subtitle"]]
[[!template text="""The conference wasn't completely virtual, even though I was.""" start="00:00:21.706" video="mainVideo-literate" id="subtitle"]]
[[!template text="""My city of Portland was suffering a citywide electrical outage""" start="00:00:25.635" video="mainVideo-literate" id="subtitle"]]
[[!template text="""and I was without power, so I gave the talk in a corner of my""" start="00:00:29.318" video="mainVideo-literate" id="subtitle"]]
[[!template text="""friend's living room. People online asking questions and""" start="00:00:33.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""wondering about literate programming... I also see comments""" start="00:00:37.440" video="mainVideo-literate" id="subtitle"]]
[[!template text="""explaining why literate programming hasn't caught on in""" start="00:00:41.440" video="mainVideo-literate" id="subtitle"]]
[[!template text="""corporate practice. I often don't engage. I mean, is the""" start="00:00:44.600" video="mainVideo-literate" id="subtitle"]]
[[!template text="""online arguments and chatter over ignorance or""" start="00:00:49.080" video="mainVideo-literate" id="subtitle"]]
[[!template text="""preference? Sure, we're wired differently. I mean, my""" start="00:00:51.600" video="mainVideo-literate" id="subtitle"]]
[[!template text="""favorite programming languages put the parentheses""" start="00:00:56.720" video="mainVideo-literate" id="subtitle"]]
[[!template text="""before the function name.""" start="00:00:59.560" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Literate programming has come a long way""" start="00:01:01.940" video="mainVideo-literate" id="subtitle"]]
[[!template text="""since Knuth proposed it in the 19th century. I feel""" start="00:01:03.801" video="mainVideo-literate" id="subtitle"]]
[[!template text="""it's come a long way just in the last 10 years. Obviously,""" start="00:01:08.520" video="mainVideo-literate" id="subtitle"]]
[[!template text="""this interest is due to Org. I don't think I would bother if""" start="00:01:13.000" video="mainVideo-literate" id="subtitle"]]
[[!template text="""all I had was Knuth's original preprocessor. But since I'm""" start="00:01:16.400" video="mainVideo-literate" id="subtitle"]]
[[!template text="""talking to fellow nerds about an open source project""" start="00:01:21.360" video="mainVideo-literate" id="subtitle"]]
[[!template text="""without corporate backing, let me change the title of my""" start="00:01:24.840" video="mainVideo-literate" id="subtitle"]]
[[!template text="""talk and re-pitch Literate Programming in the 24th and a""" start="00:01:27.920" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Half Century!""" start="00:01:32.920" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Do I still literate?""" start="00:01:35.253" video="mainVideo-literate" id="subtitle"]]
[[!template text="""People often ask if I still program that way.""" start="00:01:35.253" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I guess they want to know if there's any long-term benefits,""" start="00:01:36.654" video="mainVideo-literate" id="subtitle"]]
[[!template text="""for many of our tools and our workflows, while initially""" start="00:01:42.760" video="mainVideo-literate" id="subtitle"]]
[[!template text="""tantalizing, often don't last. But yes, when I sit down to""" start="00:01:45.920" video="mainVideo-literate" id="subtitle"]]
[[!template text="""write a program, I create a file with an extension of .org.""" start="00:01:51.080" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I guess you can say I program literally.""" start="00:01:57.760" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Let me be transparent. Do I use literate programming during""" start="00:02:03.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""my day job? Yes, but only for personal tools or for initial""" start="00:02:07.360" video="mainVideo-literate" id="subtitle"]]
[[!template text="""investigation. At the end of the sprint, I tangle the file""" start="00:02:12.600" video="mainVideo-literate" id="subtitle"]]
[[!template text="""and git commit that. My personal projects, on the other""" start="00:02:16.760" video="mainVideo-literate" id="subtitle"]]
[[!template text="""hand, are Org files. Since I can't show you the code from""" start="00:02:21.080" video="mainVideo-literate" id="subtitle"]]
[[!template text="""my day job, I'm afraid my example code will have a lot of""" start="00:02:25.680" video="mainVideo-literate" id="subtitle"]]
[[!template text="""parentheses.""" start="00:02:27.840" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I'm sure you won't mind.""" start="00:02:31.160" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I like having my Emacs configuration in Org.""" start="00:02:33.956" video="mainVideo-literate" id="subtitle"]]
[[!template text="""It's pretty bling. It has over 8,000""" start="00:02:37.357" video="mainVideo-literate" id="subtitle"]]
[[!template text="""lines of code. I know, I can hear the screams and gasps over""" start="00:02:40.360" video="mainVideo-literate" id="subtitle"]]
[[!template text="""the network. However, the surrounding prose in Org adds""" start="00:02:44.560" video="mainVideo-literate" id="subtitle"]]
[[!template text="""10,000 lines, and those lines are non-wrapped paragraphs.""" start="00:02:49.440" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I mean, is that large? Sure, we've all worked on""" start="00:02:53.411" video="mainVideo-literate" id="subtitle"]]
[[!template text="""larger, so I guess it's not huge. Come on, it's still""" start="00:02:58.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""significant.""" start="00:03:03.640" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Advantages""" start="00:03:06.332" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Advantages? Look who I'm talking to. I'm sure""" start="00:03:06.332" video="mainVideo-literate" id="subtitle"]]
[[!template text="""you know the advantages, but indulge me. I feel that one""" start="00:03:09.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""advantage of literate programming, especially with large""" start="00:03:14.280" video="mainVideo-literate" id="subtitle"]]
[[!template text="""code bases, is how you can organize and manage the""" start="00:03:16.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""complexity. Most programming languages tame large bases""" start="00:03:20.280" video="mainVideo-literate" id="subtitle"]]
[[!template text="""by putting code in separate files. While Org can too, with""" start="00:03:24.840" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Org, we can group related functions together under""" start="00:03:29.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""expandable headlines.""" start="00:03:32.280" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Here's one. You can see that""" start="00:03:35.044" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I've got different sections grouped together.""" start="00:03:37.280" video="mainVideo-literate" id="subtitle"]]
[[!template text="""In my original talk, I mentioned how I would attempt to organize""" start="00:03:40.707" video="mainVideo-literate" id="subtitle"]]
[[!template text="""my thoughts before coding. I appreciate how I can look back""" start="00:03:43.760" video="mainVideo-literate" id="subtitle"]]
[[!template text="""at my notes. In my Emacs configuration, I review the prose to""" start="00:03:47.840" video="mainVideo-literate" id="subtitle"]]
[[!template text="""help memorize key bindings.""" start="00:03:53.600" video="mainVideo-literate" id="subtitle"]]
[[!template text="""My section on getting email working with Emacs using""" start="00:03:57.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""notmuch means creating small collections of scripts and""" start="00:04:01.040" video="mainVideo-literate" id="subtitle"]]
[[!template text="""configuration files. I can tangle them all from one Org""" start="00:04:04.080" video="mainVideo-literate" id="subtitle"]]
[[!template text="""file. I like that I can explain each part separately.""" start="00:04:08.200" video="mainVideo-literate" id="subtitle"]]
[[!template text="""You just can't beat having links back to Stack Overflow or""" start="00:04:16.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""that GitHub repo where you stole, I mean, became inspired to""" start="00:04:20.880" video="mainVideo-literate" id="subtitle"]]
[[!template text="""write your code.""" start="00:04:25.520" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Disadvantages""" start="00:04:28.720" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Literate programming may push the boundaries of our""" start="00:04:28.720" video="mainVideo-literate" id="subtitle"]]
[[!template text="""workflows and revealing some abrasion, but we aren't""" start="00:04:34.280" video="mainVideo-literate" id="subtitle"]]
[[!template text="""solely working with Org. We have the flexibility of a Lisp""" start="00:04:38.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""engine to file down those rough parts. You may have your""" start="00:04:41.240" video="mainVideo-literate" id="subtitle"]]
[[!template text="""concerns. Perhaps you could reach out to me, and with""" start="00:04:45.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""particular issues, maybe we can figure something out.""" start="00:04:48.160" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Here is my list of frictions, and the rest of my talk""" start="00:04:54.240" video="mainVideo-literate" id="subtitle"]]
[[!template text="""demonstrates my answers and my hacks. The goal in literate""" start="00:04:57.440" video="mainVideo-literate" id="subtitle"]]
[[!template text="""programming with Org is that it should not require more""" start="00:05:02.160" video="mainVideo-literate" id="subtitle"]]
[[!template text="""effort than non-literate programming. For instance, I""" start="00:05:05.040" video="mainVideo-literate" id="subtitle"]]
[[!template text="""shouldn't have to type much more than regular programming""" start="00:05:08.680" video="mainVideo-literate" id="subtitle"]]
[[!template text="""to get my code literate. I also shouldn't have to worry about""" start="00:05:12.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""the state between my Org file and the source code. I want""" start="00:05:15.720" video="mainVideo-literate" id="subtitle"]]
[[!template text="""to be able to jump around my code just as easily.""" start="00:05:20.800" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Ease of typing""" start="00:05:24.133" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Let me explain more. I've created some templates using""" start="00:05:24.133" video="mainVideo-literate" id="subtitle"]]
[[!template text="""yasnippet. Since I was used to the old org-tempo feature,""" start="00:05:28.655" video="mainVideo-literate" id="subtitle"]]
[[!template text="""my habit has all the snippets starting with a""" start="00:05:34.680" video="mainVideo-literate" id="subtitle"]]
[[!template text="""< character. I'm not sure if I should demonstrate all of them""" start="00:05:37.146" video="mainVideo-literate" id="subtitle"]]
[[!template text="""as you may be doing something similar. I like to build on top""" start="00:05:40.760" video="mainVideo-literate" id="subtitle"]]
[[!template text="""of characters to remind me that if I just enter a <s, I""" start="00:05:46.000" video="mainVideo-literate" id="subtitle"]]
[[!template text="""need to put in the language. But if I append a mnemonic, I can""" start="00:05:50.000" video="mainVideo-literate" id="subtitle"]]
[[!template text="""get a full language. Why not do that with a full function""" start="00:05:53.520" video="mainVideo-literate" id="subtitle"]]
[[!template text="""definition? In this case, I'm smooshing one yasnippet""" start="00:05:56.840" video="mainVideo-literate" id="subtitle"]]
[[!template text="""inside another one in order to save myself some typing.""" start="00:06:01.200" video="mainVideo-literate" id="subtitle"]]
[[!template text="""My point here is to pay attention to what slows you down or""" start="00:06:11.680" video="mainVideo-literate" id="subtitle"]]
[[!template text="""hinders you from getting the advantages you want.""" start="00:06:15.160" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Keep tangled code sync'd""" start="00:06:24.720" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Do you ever forget to tangle your code? You can append this""" start="00:06:24.720" video="mainVideo-literate" id="subtitle"]]
[[!template text="""code to the bottom of your Org file so that it gets tangled""" start="00:06:28.400" video="mainVideo-literate" id="subtitle"]]
[[!template text="""every time you save. I've written a function so I can visit""" start="00:06:31.520" video="mainVideo-literate" id="subtitle"]]
[[!template text="""that tangled file and then return. I've grouped all my""" start="00:06:36.160" video="mainVideo-literate" id="subtitle"]]
[[!template text="""functions together. I've taken a cue from Charles Choi, you""" start="00:06:40.560" video="mainVideo-literate" id="subtitle"]]
[[!template text="""know, kickingvegas, and his Casual feature set. But""" start="00:06:45.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""instead of Transient, I've just made a hydra using""" start="00:06:48.640" video="mainVideo-literate" id="subtitle"]]
[[!template text="""the major-mode-hydra package. Anyway, this allows me to use and""" start="00:06:52.375" video="mainVideo-literate" id="subtitle"]]
[[!template text="""remember my micro-optimizations.""" start="00:06:57.400" video="mainVideo-literate" id="subtitle"]]
[[!template text="""If you set the :comments property to link,""" start="00:07:00.137" video="mainVideo-literate" id="subtitle"]]
[[!template text="""the tangled output is back-connected.""" start="00:07:03.698" video="mainVideo-literate" id="subtitle"]]
[[!template text="""This allows us to edit the tangled code and have it update the""" start="00:07:07.000" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Org file. Personally, I don't like this. My source of truth""" start="00:07:11.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""is the Org file, and I tangle as a one-way diode.""" start="00:07:16.880" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Code evaluation""" start="00:07:22.501" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Often a block of code will reference a variable""" start="00:07:22.501" video="mainVideo-literate" id="subtitle"]]
[[!template text="""or call a function to find in another block of code.""" start="00:07:25.604" video="mainVideo-literate" id="subtitle"]]
[[!template text="""In my original literate DevOps talk,""" start="00:07:29.047" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I discussed how to use the output from one block into""" start="00:07:31.509" video="mainVideo-literate" id="subtitle"]]
[[!template text="""another block by naming the first block and referencing it""" start="00:07:34.520" video="mainVideo-literate" id="subtitle"]]
[[!template text="""with a :var for the second. However, if all the blocks use the""" start="00:07:37.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""same language, you can use sessions, which create a""" start="00:07:42.160" video="mainVideo-literate" id="subtitle"]]
[[!template text="""persistent REPL behind the scenes. Let's evaluate the""" start="00:07:46.040" video="mainVideo-literate" id="subtitle"]]
[[!template text="""blocks of Python code in this file.""" start="00:07:51.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""The evaluation created a Python REPL. It's available in""" start="00:07:53.200" video="mainVideo-literate" id="subtitle"]]
[[!template text="""another buffer. This buffer matches the name of the""" start="00:08:00.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""session, but with surrounding asterisks. Evaluating a""" start="00:08:04.280" video="mainVideo-literate" id="subtitle"]]
[[!template text="""code block sends it into the REPL, and now I can work with my""" start="00:08:07.960" video="mainVideo-literate" id="subtitle"]]
[[!template text="""code blocks interactively. (That's not quite right.)""" start="00:08:11.400" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Has that block been eval'd?""" start="00:08:19.960" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I primarily hack on Emacs Lisp, and textual changes to""" start="00:08:19.960" video="mainVideo-literate" id="subtitle"]]
[[!template text="""variables, functions, or macros--unless you habitually""" start="00:08:24.040" video="mainVideo-literate" id="subtitle"]]
[[!template text="""type C-c C-c--may not represent the state of your""" start="00:08:28.200" video="mainVideo-literate" id="subtitle"]]
[[!template text="""machine. A similar effect happens in any language that""" start="00:08:31.680" video="mainVideo-literate" id="subtitle"]]
[[!template text="""uses sessions. Sure, I can move the point to a block and""" start="00:08:35.440" video="mainVideo-literate" id="subtitle"]]
[[!template text="""evaluate, but I have three functions that allow me to""" start="00:08:39.320" video="mainVideo-literate" id="subtitle"]]
[[!template text="""evaluate all blocks in a buffer or all blocks in a subtree,""" start="00:08:42.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""or I can, without moving the point, evaluate any block I see.""" start="00:08:44.735" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Now, this function here evaluates all blocks in a buffer.""" start="00:08:50.200" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Someone mentioned calling this function when you first""" start="00:08:54.920" video="mainVideo-literate" id="subtitle"]]
[[!template text="""load a file. I'm not sure that's a good policy. I mean, have""" start="00:08:58.280" video="mainVideo-literate" id="subtitle"]]
[[!template text="""you not written a bug?""" start="00:09:02.360" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Evaluating code in a subtree""" start="00:09:05.239" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Since this function right here""" start="00:09:05.239" video="mainVideo-literate" id="subtitle"]]
[[!template text="""evaluates only visible blocks, we can limit what Emacs""" start="00:09:08.560" video="mainVideo-literate" id="subtitle"]]
[[!template text="""evaluates to a single Org mode section. For instance, with""" start="00:09:12.040" video="mainVideo-literate" id="subtitle"]]
[[!template text="""the cursor in one section, I can evaluate just the blocks in""" start="00:09:18.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""that header section.""" start="00:09:23.760" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Evaluating code from a distance""" start="00:09:26.872" video="mainVideo-literate" id="subtitle"]]
[[!template text="""If I can see a block, why clumsily""" start="00:09:26.872" video="mainVideo-literate" id="subtitle"]]
[[!template text="""navigate to it when I can extend the avy project to just jump to""" start="00:09:29.400" video="mainVideo-literate" id="subtitle"]]
[[!template text="""it? For instance, let's pull this file up. I can jump to any of""" start="00:09:33.080" video="mainVideo-literate" id="subtitle"]]
[[!template text="""the four blocks.""" start="00:09:40.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I think that's quite slick. Now why navigate to a code block""" start="00:09:41.640" video="mainVideo-literate" id="subtitle"]]
[[!template text="""solely to evaluate it? Yes, this is a terrible example, but""" start="00:09:50.320" video="mainVideo-literate" id="subtitle"]]
[[!template text="""these three blocks set a variable to different values. So""" start="00:09:55.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""without moving the point, I can evaluate any one of them.""" start="00:09:59.680" video="mainVideo-literate" id="subtitle"]]
[[!template text="""To be honest, the reason why I wrote this is because I often""" start="00:10:02.600" video="mainVideo-literate" id="subtitle"]]
[[!template text="""forget to evaluate a block after editing it. I've moved on,""" start="00:10:09.720" video="mainVideo-literate" id="subtitle"]]
[[!template text="""and I just don't want to jump back. Now, I can just evaluate""" start="00:10:14.000" video="mainVideo-literate" id="subtitle"]]
[[!template text="""from a distance. I apologize for the previous terrible""" start="00:10:17.840" video="mainVideo-literate" id="subtitle"]]
[[!template text="""examples, but I'm quite pleased with this feature.""" start="00:10:22.360" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Navigating by headers""" start="00:10:26.020" video="mainVideo-literate" id="subtitle"]]
[[!template text="""As I mentioned earlier, in a large code base, we organize code by""" start="00:10:26.020" video="mainVideo-literate" id="subtitle"]]
[[!template text="""library or module, and each file contains a class composed""" start="00:10:30.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""of methods, functions, variables, fields, et cetera.""" start="00:10:33.840" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Literate programming in Org files allows me to add a""" start="00:10:37.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""semantic organization layer where I can group related""" start="00:10:40.000" video="mainVideo-literate" id="subtitle"]]
[[!template text="""concepts under headlines. Now, while this isn't specific""" start="00:10:43.160" video="mainVideo-literate" id="subtitle"]]
[[!template text="""to literate programming, I wrote a little user interface to""" start="00:10:46.920" video="mainVideo-literate" id="subtitle"]]
[[!template text="""allow me to jump to any heading in any Org file""" start="00:10:50.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""in a particular project.""" start="00:10:54.297" video="mainVideo-literate" id="subtitle"]]
[[!template text="""These are the headings in my Emacs configuration project.""" start="00:10:57.680" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Notice the file name beforehand, before the colon""" start="00:11:02.880" video="mainVideo-literate" id="subtitle"]]
[[!template text="""character. The header name and its parent headers are""" start="00:11:06.560" video="mainVideo-literate" id="subtitle"]]
[[!template text="""after. Let me search for the LSP sections. Maybe I only want""" start="00:11:09.760" video="mainVideo-literate" id="subtitle"]]
[[!template text="""the one for Python. Now I use ripgrep to search the files and""" start="00:11:14.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""then some Lisp to parse the output. Unless someone has""" start="00:11:20.040" video="mainVideo-literate" id="subtitle"]]
[[!template text="""already done this, I should package this up on MELPA.""" start="00:11:24.560" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Navigating by function names""" start="00:11:26.794" video="mainVideo-literate" id="subtitle"]]
[[!template text="""What about jumping directly to the definition of a function,""" start="00:11:26.794" video="mainVideo-literate" id="subtitle"]]
[[!template text="""variable, or what have you? We can use Emacs's built-in xref""" start="00:11:32.200" video="mainVideo-literate" id="subtitle"]]
[[!template text="""library, but these functions don't understand that the""" start="00:11:36.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""source code is in Org files. When I started using Emacs""" start="00:11:39.880" video="mainVideo-literate" id="subtitle"]]
[[!template text="""30-something years ago, I would pre-index my source into""" start="00:11:45.320" video="mainVideo-literate" id="subtitle"]]
[[!template text="""tag files, but the dumb-jump project uses the newfangled and""" start="00:11:49.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""faster text search programs like ripgrep to find a symbol in""" start="00:11:53.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""real time. I followed this pattern and wrote an extension""" start="00:11:58.320" video="mainVideo-literate" id="subtitle"]]
[[!template text="""to the xref API. Now, I want to jump around my code from both""" start="00:12:02.320" video="mainVideo-literate" id="subtitle"]]
[[!template text="""code block or in the surrounding prose. I'm sure it""" start="00:12:08.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""comes as no surprise that my presentation is just an Org""" start="00:12:14.520" video="mainVideo-literate" id="subtitle"]]
[[!template text="""file. Let's suppose my cursor is on this symbol. I wrote this""" start="00:12:18.200" video="mainVideo-literate" id="subtitle"]]
[[!template text="""function for this demonstration. We can jump to the""" start="00:12:23.920" video="mainVideo-literate" id="subtitle"]]
[[!template text="""definition and I can jump back.""" start="00:12:28.080" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Notice it jumped into an Org file and back out. References,""" start="00:12:30.760" video="mainVideo-literate" id="subtitle"]]
[[!template text="""unlike definitions, is where something is defined and""" start="00:12:37.640" video="mainVideo-literate" id="subtitle"]]
[[!template text="""where it's used. Well, you know how the xref system works.""" start="00:12:42.280" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Here, I can jump to the definition or where it's""" start="00:12:46.920" video="mainVideo-literate" id="subtitle"]]
[[!template text="""used. Of course, and jump back. I think this is cool. This""" start="00:12:52.680" video="mainVideo-literate" id="subtitle"]]
[[!template text="""should be a nifty package on MELPA. But my code is specific to""" start="00:12:59.520" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Lisp, and I'm not completely sure how to make it general. For""" start="00:13:04.320" video="mainVideo-literate" id="subtitle"]]
[[!template text="""instance, what is a symbol? If you know the language, this is""" start="00:13:08.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""obvious. But what should the language be when your cursor is""" start="00:13:13.400" video="mainVideo-literate" id="subtitle"]]
[[!template text="""in the prose of an Org file? Python only supports sequences""" start="00:13:17.680" video="mainVideo-literate" id="subtitle"]]
[[!template text="""of alphanumeric and underscores, but in Lisp, a symbol can""" start="00:13:22.640" video="mainVideo-literate" id="subtitle"]]
[[!template text="""be almost any character sequence. I've been stewing on how""" start="00:13:25.560" video="mainVideo-literate" id="subtitle"]]
[[!template text="""to do this. I have ideas like prompting during the first""" start="00:13:30.400" video="mainVideo-literate" id="subtitle"]]
[[!template text="""query or scanning the language based on the nearest code""" start="00:13:34.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""block. I think I'm babbling.""" start="00:13:37.720" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Why literate programming?""" start="00:13:40.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""In true geek fashion, I dived into the details before""" start="00:13:40.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""answering some better questions. In my original Literate""" start="00:13:47.200" video="mainVideo-literate" id="subtitle"]]
[[!template text="""DevOps talk, I explained the advantages of initially""" start="00:13:52.080" video="mainVideo-literate" id="subtitle"]]
[[!template text="""writing down your thoughts, your plans, goals... the""" start="00:13:55.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""user requirements. But what do you do with all that luscious""" start="00:13:58.960" video="mainVideo-literate" id="subtitle"]]
[[!template text="""prose afterwards? Well, you do the same thing you do to your""" start="00:14:02.880" video="mainVideo-literate" id="subtitle"]]
[[!template text="""initial code. You refactor that prose.""" start="00:14:06.360" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Just because the tech surrounding your code is now a""" start="00:14:09.280" video="mainVideo-literate" id="subtitle"]]
[[!template text="""first-class citizen doesn't excuse bad code. You want""" start="00:14:14.760" video="mainVideo-literate" id="subtitle"]]
[[!template text="""something more from both your code and your prose.""" start="00:14:18.800" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""LP prose isn't comments""" start="00:14:23.166" video="mainVideo-literate" id="subtitle"]]
[[!template text="""The prose of your literate program isn't""" start="00:14:23.166" video="mainVideo-literate" id="subtitle"]]
[[!template text="""just regurgitation of the code in the block.""" start="00:14:25.587" video="mainVideo-literate" id="subtitle"]]
[[!template text="""You want something more helpful.""" start="00:14:28.668" video="mainVideo-literate" id="subtitle"]]
[[!template text="""You're really writing a research paper to yourself.""" start="00:14:31.528" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I know what you're thinking. You've seen my Git repos.""" start="00:14:35.737" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I'm guilty and not always the best example.""" start="00:14:38.578" video="mainVideo-literate" id="subtitle"]]
[[!template text="""However, I do get great joy""" start="00:14:41.859" video="mainVideo-literate" id="subtitle"]]
[[!template text="""when I see someone ask about something in Emacs""" start="00:14:44.560" video="mainVideo-literate" id="subtitle"]]
[[!template text="""and my response is little more than a link""" start="00:14:48.681" video="mainVideo-literate" id="subtitle"]]
[[!template text="""to my online repo that I've rendered as a website.""" start="00:14:51.042" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Summary""" start="00:14:55.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I'm out of time. I hope this has been interesting""" start="00:14:55.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""philosophically as well as practically, as I think""" start="00:15:01.200" video="mainVideo-literate" id="subtitle"]]
[[!template text="""literate programming is the cat's meow. I'm afraid this""" start="00:15:04.360" video="mainVideo-literate" id="subtitle"]]
[[!template text="""summary slide is about my home-baked solutions that fit my""" start="00:15:08.560" video="mainVideo-literate" id="subtitle"]]
[[!template text="""needs, but hopefully you can recognize your pain points and""" start="00:15:11.880" video="mainVideo-literate" id="subtitle"]]
[[!template text="""address them. If you don't need my Literate""" start="00:15:15.120" video="mainVideo-literate" id="subtitle"]]
[[!template text="""DevOps-specific techniques for connecting code blocks, I""" start="00:15:17.840" video="mainVideo-literate" id="subtitle"]]
[[!template text="""suggest using sessions by default. I highly recommend""" start="00:15:21.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""looking at your workflow and writing snippets to give you""" start="00:15:25.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""less typing for Org blocks. I now jump by headlines in my""" start="00:15:28.400" video="mainVideo-literate" id="subtitle"]]
[[!template text="""projects, but extending xref to support Org files made""" start="00:15:33.160" video="mainVideo-literate" id="subtitle"]]
[[!template text="""literate programming as easy as programming the""" start="00:15:37.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""old-fashioned way. I do need to make it more general to put up""" start="00:15:40.160" video="mainVideo-literate" id="subtitle"]]
[[!template text="""on MELPA, though. Thanks for watching.""" start="00:15:44.320" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Happy hacking, my friends.""" start="00:15:47.723" video="mainVideo-literate" id="subtitle"]]
</div>
Captioner: sachac
Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202023%20literate%3A%20Literate%20programming%20for%20the%2021st%20Century)
<!-- End of emacsconf-publish-after-page -->
|