summaryrefslogblamecommitdiffstats
path: root/2024/info/literate-after.md
blob: eb3089f1f5f028521e25094e057610d26d48fdde (plain) (tree)
1
2
3


                                                                



























































































































































































































































































                                                                                                                                                        
                                                                                                                                                                                                                       
 

                                            
<!-- Automatically generated by emacsconf-publish-after-page -->


<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"]]



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 -->