00:00.000 Introduction
01:35.253 Do I still literate?
03:06.332 Advantages
04:28.720 Disadvantages
05:24.133 Ease of typing
06:24.720 Keep tangled code sync'd
07:22.501 Code evaluation
08:19.960 Has that block been eval'd?
09:05.239 Evaluating code in a subtree
09:26.872 Evaluating code from a distance
10:26.020 Navigating by headers
11:26.794 Navigating by function names
13:40.480 Why literate programming?
14:23.166 LP prose isn't comments
14:55.800 Summary
02:07.400 Q: What's the largest code base you've ever tackled with the literate approach (esp. Emacs + Org-mode)?
03:58.080 Q: Have you ever used org-transclusion?
04:08.440 Q: What is your usage of dynamic blocks in such workflows?
04:48.840 Q: Is the minibuffer being deliberately hidden in this video?
05:17.341 Q: What's your take on Emacs+Org vs. Jupyter notebooks (for interactive programming)?
07:07.800 Q: Do you think any programming language is more suited to literate programming than another?
08:21.560 Q: Do you use inline org function calls and org babel library and such?
09:36.970 Q: How do you handle the cases where org markup may sometimes interfere with some of the code?
11:06.220 Q: You said at the start that literate didn't catch on in corporate DevOps - why not?
11:29.421 Q: Why not that full stack on Markdown?
12:22.120 Corwin's aside on orgvm
14:49.520 Org and Markdown fragmentation
16:17.920 Q: How does your management of "TODOs" (projects/tasks) interact with this literate mindset, any insightful things you do on that front?
17:30.630 Q: Do you LP also on larger projects?
18:38.936 Q: Have you used Cucumber/Gherkin/BDD and do you think it has a strong overlap to what you talked about here?
19:54.600 Q: What granularity are you looking for re your org files and contents, with respect to a codebase that it tangles to, or in non-coding contexts?
Donald Knuth’s idea of literate programming in the 80’s and 90’s was
interesting, but he didn’t realize what Emacs and Org can do in this
century. In this talk, I would like to go back your initial dabblings
with Org src blocks to show how you can program literately as quickly
as you can in any other mode.
Some of the tips and tricks include:
Automatically keeping your lit code sync’d
Easier code generation
Jumping to Org headers to help organize code
Jumping to code definitions with the xref interface
At the end of this talk, I hope to inspire you to try it again, as my
personal “go to” is programming literately.
About ten years ago, I gave a talk I called literate devops and people
still ask me if I still use those techniques. For all my personal
projects, I do. Even projects that I share with others, I often start
programming with an Org file.
I will admit, programming within Org blocks has some burrs, but over
the years, I’ve filed them off with helper functions, snippets and
other features. Thought I would share these.
Discussion
Questions and answers
Q: You touched on it briefly, but how do you handle things like
"C-h f" helpful info not being tied back to the defuns in src
block code when you "C-c C-c" them in the org buffers instead of
re-tangling it to the files, and other such things? Did you create
wrappers for jumping back and forth atop org's built-in mechanisms
to go back and forth between org/tangled files?
A: (not yet answered)
Q: Apropos large literate programs: what's the largest code base
you've ever tackled with the literate approach (esp. Emacs +
Org-mode)?
A: The largest is the one I mentioned in the talk ... about
8000 lines of "code" and another "10000" lines of prose. I
think I came to 15,000 max (in code blocks only).
Q: What is your usage of dynamic blocks in such workflows? Any
interesting use cases and custom ones?
A: Not yet, will report back
Q:Is the minibuffer being deliberately hidden in this video? (first
noticed this in the section previous to "Navigating by Function
Names")
A: Not intentionally You may notice the minibuffer comes and
goes, sorry about that; not intentional (didn't quite "fix"
all of them) (Thanks for the answer, no worries.)
Q:What's your take on Emacs+Org vs. Jupyter notebooks (for
interactive programming)?
A: Not something I use right now. Tend to include things from
jupyter/python (e.g. numpy) that has been the biggest challenge
(not knowing that stuff all that well), things like matrix
multiplications are easy in jupyter not such much in org. May
make sense to stay where you are comfortable. Curious what the
community can do to make this transition easier
You can't work with Jupyter in > 1 language either (I think).
It's Py + SQL or R + SQL etc. Org allows 45+ languages in one
document (I often mix languages).
Q: Do you think any programming language is more suited to literate
programming than another?
A: R, C are my favorites (for literate programs). C (and C++)
have got great support. There are some great books implemented
in literate programming I think. The two that come to mind are
Physically Based Rendering: From Theory to Implementation and C
Interfaces and Implementations. The first is C++ and the
second C. Ty.
\<gs-101> Personally, when working with Org files, I have a
better time dealing with interpreted languages, such as Python,
because you can initialize a session and the code is all
conected. You can divide blocks however you seem fit.
Q: related to above, do you use inline org function calls and org
babel library and such?
A: Used to use more org-babel inline functions, found sound bugs
(maybe) 8yrs ago, right now my literate dev-ops is calling a lot
of backend programs so the org-babel has limited help in that
regard while in the emacs session things are "just available"
so that hasn't help much either
Q: How do you handle the cases where org markup may sometimes
interfere with some of the code, in places where you can't use
"escapes" (\~ or = or | \<- vertical bar), doubly so if you use
modes to not show these but the styled text instead, and so on?
I think an example is in C when you assign to a pointer *p = &i;
(In Org, you need to write (*p) or ,*p = &i; or it will be
mistaken for a headline *
A: (clarifying) when I'm making pros and I'm talking about a
function I've written somewhere else I'll use tildes and look
for those things so I can strip them off. Is that the spirit of
the question. (confirmed). Yes, I'll strip that off after
finding the function name, so I can still mark it correctly.
Q: clarifying: when in code inside an org buffer, you don't get
to use \~ or = (verbatim/etc), and any font-locking interferes
with the proper display in the src blocks, that kind of
interference.
Q: You said at the start that literate didn't catch on in corporate
DevOps - why not?
A: I guess the big thing is not everyone is using Emacs and org
is needed to make it work really well.
Q: I gotta ask: why not that full stack on Markdown, I'm sure it's
crossed your mind at least a few times how the same setup on
Markdown would be more interop-friendly with colleagues and such?
A: It's a real good idea.
Q: How does your management of "TODOs" (projects/tasks) interact
with this literate mindset, any insightful things you do on that
front?
A: Yeah. Okay. So, uh, on to do's and that sort of thing, um. You know, a lot is the same as it was 10 years ago. At the beginning of every sprint, my company, we're using JIRA. All jokes are valid when I say that. But I just go to its web page. I copy all the tasks that I need to do that sprint. I wrote a function that takes that code and reformats it as a bunch of org tasks for me to do that I can just now have all my to-dos. And I start to work off of that from that point on. So it'll reference all the projects, and I do symlinks to every code base that I need to use. Most of the to-dos I put inside my code block is kind of just for me, just so I can remember it. Because the work that I have to do needs to be tracked a little more fine-grained, I guess. Yeah.
Q: \<Donovan> Do you LP also on larger projects? (More files &
nested directories)
A: I haven't done nested directories, but I can now. Now that
i've realized I have the feature where I can just jump to any
projects and all the org-files and all the headings just show
up, that works in nested directories, that that's fun.
Q: Have you used Cucumber/Gherkin/BDD and do you think it has a
strong overlap to what you talked about here?
A: I tend to put the tests right next to the function, I like
tangle it out to different files; keeping things together is
nice. Many frameworks assume we'll have things seperated out
in a way that isn't useful to me. I like to go old-school on
that?
Q: What granularity are you looking for re your org files and
contents, with respect to a codebase that it tangles to, or in
non-coding contexts?
A: Great questions, really subjective. I change that all
time. I have an idea, I start to refine it. My goal at one
point was to have an emacs config that was really small and
simple and that just really doesn't happen, it's full of ideas
and things that are half-baked and i pull them out and polish
them up bit by bit so it ends up being like any code-base it
just keeps getting refined. Sub-trees, archiving are useful.
I've found it useful to prune the init file back to minimal
every once in a while (actually, AI has been surprisingly
helpful - perhaps it helps that Emacs is ancient and hence there
is a lot of doc out there and much of it ... correct?)
Not a Q, just a comment that we need more of your insightful
posts and videos! (sic)
I am both hyped and scared by Howard's talk, some of his past insights into using org-mode (literate everything, many small spreadsheets, etc.) have changed the way I operate so thoroughly...
19th century? Isn't that in the 1800s?
21 1/4 century?
you are not incorrect I believe - easy mistake to make, it's not intuitive!
YouTube comment: 1:00 So Knuth invented literate programming in the 19th century? I knew he was old, but not that old!
i think the only time i have worked with literate programming is Inform 7
I find that the Julia support in org (babel) is good enough. Most of my programming is in Julia.
re: Julia in Org: For ob-julia support I wrote an ob-julia that does a few more things than the one that ships with ESS. https://github.com/karthink/ob-julia
(I'm here trying to milk Howard for all his fantastic insights in the Etherpad, hope that's not a faux-pas...!)
I, at least, am enjoying the Q&A session so not a faux-pas as far as I'm concerned.
YouTube comment: The best reason I've heard explaining why most programmers don't (and won't) use literate programming. It requires them to be literate in three languages: the programming language, the markup language, and most challenging of all, English.
YouTube comment: Q: Literate programming is very appealing in theory, but it's difficult with languages like Go where your code is split across multiple files. Any suggestions?
Feedback:
very cool
Lovely talk, thank you!
Awesome, thank you!
That was wonderful, thank you! 😊
Thank you Howard!
Thanks for your continued work, Howard!
A legend! ... loved the Ironsworn presentation from previous year.
excellent presentation indeed
Thank you for the marvelous talk!!
Thanks for the presentation
Your way of delivering is inspiring.
god I wish I was that good a presenter
I for one had been looking forward to this particular talk, so there's that
YouTube comment: Legend!
YouTube comment: Howard! Your videos have been such an amazing source of information. You voice is engrained in my brains haha
Can you believe it's been a decade since I startedpontificating on literate programming?I am Howard Abrams. In 2015, I spoke at this EmacsConfwhere I described my challenges I called Literate DevOps.The conference wasn't completely virtual, even though I was.My city of Portland was suffering a citywide electrical outageand I was without power, so I gave the talk in a corner of myfriend's living room. People online asking questions andwondering about literate programming... I also see commentsexplaining why literate programming hasn't caught on incorporate practice. I often don't engage. I mean, is theonline arguments and chatter over ignorance orpreference? Sure, we're wired differently. I mean, myfavorite programming languages put the parenthesesbefore the function name.Literate programming has come a long waysince Knuth proposed it in the 19th century. I feelit's come a long way just in the last 10 years. Obviously,this interest is due to Org. I don't think I would bother ifall I had was Knuth's original preprocessor. But since I'mtalking to fellow nerds about an open source projectwithout corporate backing, let me change the title of mytalk and re-pitch Literate Programming in the 24th and aHalf Century!
People often ask if I still program that way.I guess they want to know if there's any long-term benefits,for many of our tools and our workflows, while initiallytantalizing, often don't last. But yes, when I sit down towrite a program, I create a file with an extension of .org.I guess you can say I program literally.Let me be transparent. Do I use literate programming duringmy day job? Yes, but only for personal tools or for initialinvestigation. At the end of the sprint, I tangle the fileand git commit that. My personal projects, on the otherhand, are Org files. Since I can't show you the code frommy day job, I'm afraid my example code will have a lot ofparentheses.I'm sure you won't mind.I like having my Emacs configuration in Org.It's pretty bling. It has over 8,000lines of code. I know, I can hear the screams and gasps overthe network. However, the surrounding prose in Org adds10,000 lines, and those lines are non-wrapped paragraphs.I mean, is that large? Sure, we've all worked onlarger, so I guess it's not huge. Come on, it's stillsignificant.
Advantages? Look who I'm talking to. I'm sureyou know the advantages, but indulge me. I feel that oneadvantage of literate programming, especially with largecode bases, is how you can organize and manage thecomplexity. Most programming languages tame large basesby putting code in separate files. While Org can too, withOrg, we can group related functions together underexpandable headlines.Here's one. You can see thatI've got different sections grouped together.In my original talk, I mentioned how I would attempt to organizemy thoughts before coding. I appreciate how I can look backat my notes. In my Emacs configuration, I review the prose tohelp memorize key bindings.My section on getting email working with Emacs usingnotmuch means creating small collections of scripts andconfiguration files. I can tangle them all from one Orgfile. I like that I can explain each part separately.You just can't beat having links back to Stack Overflow orthat GitHub repo where you stole, I mean, became inspired towrite your code.
Literate programming may push the boundaries of ourworkflows and revealing some abrasion, but we aren'tsolely working with Org. We have the flexibility of a Lispengine to file down those rough parts. You may have yourconcerns. Perhaps you could reach out to me, and withparticular issues, maybe we can figure something out.Here is my list of frictions, and the rest of my talkdemonstrates my answers and my hacks. The goal in literateprogramming with Org is that it should not require moreeffort than non-literate programming. For instance, Ishouldn't have to type much more than regular programmingto get my code literate. I also shouldn't have to worry aboutthe state between my Org file and the source code. I wantto be able to jump around my code just as easily.
Let me explain more. I've created some templates usingyasnippet. Since I was used to the old org-tempo feature,my habit has all the snippets starting with a< character. I'm not sure if I should demonstrate all of themas you may be doing something similar. I like to build on topof characters to remind me that if I just enter a <s, Ineed to put in the language. But if I append a mnemonic, I canget a full language. Why not do that with a full functiondefinition? In this case, I'm smooshing one yasnippetinside another one in order to save myself some typing.My point here is to pay attention to what slows you down orhinders you from getting the advantages you want.
Do you ever forget to tangle your code? You can append thiscode to the bottom of your Org file so that it gets tangledevery time you save. I've written a function so I can visitthat tangled file and then return. I've grouped all myfunctions together. I've taken a cue from Charles Choi, youknow, kickingvegas, and his Casual feature set. Butinstead of Transient, I've just made a hydra usingthe major-mode-hydra package. Anyway, this allows me to use andremember my micro-optimizations.If you set the :comments property to link,the tangled output is back-connected.This allows us to edit the tangled code and have it update theOrg file. Personally, I don't like this. My source of truthis the Org file, and I tangle as a one-way diode.
Often a block of code will reference a variableor call a function to find in another block of code.In my original literate DevOps talk,I discussed how to use the output from one block intoanother block by naming the first block and referencing itwith a :var for the second. However, if all the blocks use thesame language, you can use sessions, which create apersistent REPL behind the scenes. Let's evaluate theblocks of Python code in this file.The evaluation created a Python REPL. It's available inanother buffer. This buffer matches the name of thesession, but with surrounding asterisks. Evaluating acode block sends it into the REPL, and now I can work with mycode blocks interactively. (That's not quite right.)
I primarily hack on Emacs Lisp, and textual changes tovariables, functions, or macros--unless you habituallytype C-c C-c--may not represent the state of yourmachine. A similar effect happens in any language thatuses sessions. Sure, I can move the point to a block andevaluate, but I have three functions that allow me toevaluate all blocks in a buffer or all blocks in a subtree,or I can, without moving the point, evaluate any block I see.Now, this function here evaluates all blocks in a buffer.Someone mentioned calling this function when you firstload a file. I'm not sure that's a good policy. I mean, haveyou not written a bug?
Since this function right hereevaluates only visible blocks, we can limit what Emacsevaluates to a single Org mode section. For instance, withthe cursor in one section, I can evaluate just the blocks inthat header section.
If I can see a block, why clumsilynavigate to it when I can extend the avy project to just jump toit? For instance, let's pull this file up. I can jump to any ofthe four blocks.I think that's quite slick. Now why navigate to a code blocksolely to evaluate it? Yes, this is a terrible example, butthese three blocks set a variable to different values. Sowithout moving the point, I can evaluate any one of them.To be honest, the reason why I wrote this is because I oftenforget to evaluate a block after editing it. I've moved on,and I just don't want to jump back. Now, I can just evaluatefrom a distance. I apologize for the previous terribleexamples, but I'm quite pleased with this feature.
As I mentioned earlier, in a large code base, we organize code bylibrary or module, and each file contains a class composedof methods, functions, variables, fields, et cetera.Literate programming in Org files allows me to add asemantic organization layer where I can group relatedconcepts under headlines. Now, while this isn't specificto literate programming, I wrote a little user interface toallow me to jump to any heading in any Org filein a particular project.These are the headings in my Emacs configuration project.Notice the file name beforehand, before the coloncharacter. The header name and its parent headers areafter. Let me search for the LSP sections. Maybe I only wantthe one for Python. Now I use ripgrep to search the files andthen some Lisp to parse the output. Unless someone hasalready done this, I should package this up on MELPA.
What about jumping directly to the definition of a function,variable, or what have you? We can use Emacs's built-in xreflibrary, but these functions don't understand that thesource code is in Org files. When I started using Emacs30-something years ago, I would pre-index my source intotag files, but the dumb-jump project uses the newfangled andfaster text search programs like ripgrep to find a symbol inreal time. I followed this pattern and wrote an extensionto the xref API. Now, I want to jump around my code from bothcode block or in the surrounding prose. I'm sure itcomes as no surprise that my presentation is just an Orgfile. Let's suppose my cursor is on this symbol. I wrote thisfunction for this demonstration. We can jump to thedefinition and I can jump back.Notice it jumped into an Org file and back out. References,unlike definitions, is where something is defined andwhere it's used. Well, you know how the xref system works.Here, I can jump to the definition or where it'sused. Of course, and jump back. I think this is cool. Thisshould be a nifty package on MELPA. But my code is specific toLisp, and I'm not completely sure how to make it general. Forinstance, what is a symbol? If you know the language, this isobvious. But what should the language be when your cursor isin the prose of an Org file? Python only supports sequencesof alphanumeric and underscores, but in Lisp, a symbol canbe almost any character sequence. I've been stewing on howto do this. I have ideas like prompting during the firstquery or scanning the language based on the nearest codeblock. I think I'm babbling.
In true geek fashion, I dived into the details beforeanswering some better questions. In my original LiterateDevOps talk, I explained the advantages of initiallywriting down your thoughts, your plans, goals... theuser requirements. But what do you do with all that lusciousprose afterwards? Well, you do the same thing you do to yourinitial code. You refactor that prose.Just because the tech surrounding your code is now afirst-class citizen doesn't excuse bad code. You wantsomething more from both your code and your prose.
The prose of your literate program isn'tjust regurgitation of the code in the block.You want something more helpful.You're really writing a research paper to yourself.I know what you're thinking. You've seen my Git repos.I'm guilty and not always the best example.However, I do get great joywhen I see someone ask about something in Emacsand my response is little more than a linkto my online repo that I've rendered as a website.
I'm out of time. I hope this has been interestingphilosophically as well as practically, as I thinkliterate programming is the cat's meow. I'm afraid thissummary slide is about my home-baked solutions that fit myneeds, but hopefully you can recognize your pain points andaddress them. If you don't need my LiterateDevOps-specific techniques for connecting code blocks, Isuggest using sessions by default. I highly recommendlooking at your workflow and writing snippets to give youless typing for Org blocks. I now jump by headlines in myprojects, but extending xref to support Org files madeliterate programming as easy as programming theold-fashioned way. I do need to make it more general to put upon MELPA, though. Thanks for watching.Happy hacking, my friends.
Captioner: sachac
Q&A transcript (unedited)
I'm doing great. Good to hear from you guys. Yeah, I mean,you've been a regular of the show, I would say, for quite awhile, and it's good. I really like the retrospective thatyou did the first time you attended EmacsConf. And when wasit? Was it 2015? I can't actually remember. 2015 was when Ipresented that, but I did an earlier talk the year before. Soyeah, that's why it's kind of thing. It's like, wow, it'sbeen a decade. It's been a while. Yeah, and I'm glad that youare in a much better recording situation than you were in2015 at the back of your colleague's house. It's good to seeyou at your own place. Well, it's also nice to pre-record andthen just share. Yeah, I mean, that's why we keep talkingabout pre-recording. You know, when we really pushedpre-recordings, I think it was five years ago when westarted, people were not really liking it. They thought,oh, but most conferences are just asking you to come andchat. And, you know, I don't need to do the peskypre-recording. But now, and especially for you regulars,you're really starting to realize that pre-recordings areactually amazing for everyone. You're less stressed on theday of the conference. We, the organizers, are way lessstressed. So it's a win-win scenario for absolutelyeveryone in the equation. Okay, so there's someconfirmation bias at work, but I'm not really arguing withwhat Leo says for the record. It may be that we are just thatthis stoked that we're lying to ourselves by theopportunity that we have to chat with each of you. Sure.Sure. Sure. I have really appreciated all of the, thetranscripts. It's been great that, you know, to be able toread and copy and paste and all that kind of thing. Yeah, it'sgreat. So yeah, let's answer some questions here.Let's see. Yeah, just feel free to jump onto the Etherpad andjust drop on the questions. I'll keep answering them all daykind of thing and get better answers as we go along.
[00:02:07.400]Q: What's the largest code base you've ever tackled with the literate approach (esp. Emacs + Org-mode)?
So yeah, the first question here is, what's my largest code base?I kind of touched it in my presentation. However, I thinksomeone just went through and did a better count than itlooks like. a little bit more. Soas I joked about in the video, we've all worked on larger codebases, but that's still, it's kind of significant. So it'snot, so yeah, anyway. So let's talk a little bit aboutsearching for functions here. If you've got your functionsin your code or code block, well, you can search for thedescriptions, you know, as long as you've evaluated it. Andso that wasn't so much of a problem, but I did want to like lookat the commentary around any function that I would define.And that's where, yeah, you know, the C-x or theC-f to define that function and display it. It won'tpull out the literate stuff around it, obviously, it'llonly do the doc header. But if you could search for it and findit quick, then it might be just as useful. And I guess that'swhy I started getting into seeing if I can't tie that into theX ref. you know, just the standard ways. My first part, Inoticed that evil has a different way of searching throughfor looking for code definitions. That was my first forayinto it. It's like, oh, that's not a bad idea. Let's hook it upunder, you know, in the standard way.
Let's see. Have I ever used org-transclusion?No, I haven't, but I think I want totake a look at it. I haven't heard of it before.
[00:04:08.440]Q: What is your usage of dynamic blocks in such workflows?
Let's see. What's my usage of dynamic blocks in myworkflows? You know, that's a real good question. I haven'treally used them a lot in all of my workflows, but yeah, it'san interesting, you know, we always start.At first, allwe're doing is just taking a few notes, then we startorganizing, then we've got links, and then we're writingcode blocks, and then agendas, and table, you know, we keepbuilding up on it.I guess I haven't really added that tomy workflow, but maybe I'll have to come backand report on that.
[00:04:48.840]Q: Is the minibuffer being deliberately hidden in this video?
Is the mini buffer being deliberately hidden in myvideo? Not deliberately. I recorded it first andaccidentally not clipped the video and turned that all off.So I went through and started fixing all of it. But yeah, soyou'll notice the mini buffer kind of comes and goes in thevideo. Sorry about that.So yeah, it wasn't intentional at all.
[00:05:17.341]Q: What's your take on Emacs+Org vs. Jupyter notebooks (for interactive programming)?
What's my take on Emacs Org versus Jupyter? That's a realgood question. I've been toying about seeing if I could doeverything that some people do with Jupyter notebooks inorder. I don't need to do it as much because I'm still kind ofdoing a lot of list programming and a lot of my DevOps, whichis a lot of shell work and a lot of Python. Most of the Jupyternotebooks, they automatically include a lot of things infrom either Julia or Python, like NumPy and all the dynamicstuff that's going on there. Since it has a server,it seems like it's running a lot more stuff and then justshipping it back off into the web app. That has been thebiggest challenge as I've tried to kind of duplicate that. Idon't really know NumPy and all the math stuff and that sortof stuff that well. So trying to do like matrixmultiplications and that kind of thing that seemed to bepretty easy in the Jupyter, it's not very easy in Org. I'veattempted to kind of work with Julia and the Julia supportfor Org is really limited it seems. That's the, So, yeah,there's some improvements we could probably make. So, Ithink if somebody is comfortable with Jupiter, and thatseems to work, you may have to stay there. I don't know howeasy. I would be curious to try to see what we could do as acommunity to kind of make that transition a lot easier.
[00:07:07.800]Q: Do you think any programming language is more suited to literate programming than another?
Do you think any programming languageis more suited to literateprogramming than another? Hey, that's a real goodquestion. A lot of mine is with Emacs Lisp, and obviouslythat's a first-class citizen in Emacs. Go figure, right? Sothat one certainly works. A lot depends on the support in theOB version for the Babel work. Python is really wellsupported, and yeah, Emacs Lisp. Others, Shell, you know,it works, but it's hard to get both the values, the variablesout of the environment variables into your thing. So mosteverything is just with the results of output. So, you know,some languages aren't quite as good as others for sure. Iwould love to see better support for more interestinglanguages, especially ones that are compiled. I've beendabbling with Rust and like, yeah, what can we do to have Rustmore iterative as well? So...
[00:08:21.560]Q: Do you use inline org function calls and org babel library and such?
Do you use inline org function calls in Org Babel library? SoI used to do a lot of Org Babel libraries to kind of sharethings.Yeah. What I. But yeah. Sorry, I'm just kind of thinkingthrough here. I've done a lot of it in the past. There were alot of bugs in it. Oh, I don't know, eight years ago when I wasplaying with it. I bet things have improved a lot more and itprobably saved me a lot more effort. Right now, most of theliterate devops, the devops kind of stuff that I'm doing, iscalling a lot of back-end programs and that sort of thing. Sothe Org Babel kind of has limited help in that regard. And asfar as my Emacs work, well, it's just part of the session. Soit's going to be available or not. So that hasn't been ashelpful either. So it's kind of dropped off. But I bet ifyou're using something like, say, Python, it might be a lotmore helpful.
[00:09:36.970]Q: How do you handle the cases where org markup may sometimes interfere with some of the code?
Another question, how do you handle the caseswhere markup may sometimes interfere with some of the codein places where you can't escape? Oh, okay. All right. Let mesee if I understand the question correctly.When I, like, when I'm making prose, and I'm talking about afunction that I've written somewhere else, like, oh, I needto work on this, or this calls this, and yeah, I'll use thetildes or the equal signs on either side to make sure it's.that it's clear that it's code. In my xref, when I'm doing athing-at-point so it can go look for that symbol, I do look forthose things at the end and strip them off so that I can mark itup and still search and it's still okay. I'm not sure ifthat's the answer to the question. Yeah, clarifying. I'mmaking prose. I'm talking about a function I've writtensomewhere else. Yeah, yeah, yeah, that is what I'm talkingabout, where a function with tildes on either end, and if I doan xref search find for that symbol, it'll strip that off andthen still look for the function name, so I can still mark itcorrectly.
[00:11:06.220]Q: You said at the start that literate didn't catch on in corporate DevOps - why not?
You said at the start that literate didn't catch on incorporate devops, why not? You know,I guess the big thing is not everybody's using Emacs,and I don't think anybody would bedoing literate programming if you didn'thave Emacs. I mean, you got to have Org, or it justdoesn't work that well, right?
Why not that full stack on Markdown? Yeah, so I often do a lotof Markdown. I have got, so I've gone through and make mymarkdown look a lot like Org. So my headers are the same sizeas org. When I mark, do the triple back ticks, you know, andspecify your language, we can now colorize that.So you can kind of now have itsyntactically marked up. It would beinteresting if we kind of expanded on Markdown so that Icould do a C-c twice on it and run that code block.That's a real good idea. Maybe we should work on that.
How does your management of TODOs, projects, and tasksinteract with this literate mindset? I can't believe I'mgoing to do this, but Howard, I'm going to break right inthere because I just can't. I need to talk about that. So thisis I bought a domain. And really what I mean is I have thisdomain if somebody gets some work done in this area. I'mfascinated by this. That's mostly really actually my wholecomment. But I just wanted to say, indeed, that is somethingmaybe we should work on. Well said. I think the idea of havingsomething that's full-stack baked around Emacs is prettyfascinating, just thinking about it as some command linetool that we can run to get some work done, and then there aredocuments involved, and as you know coming backto the kind of corporatesense of some of the things like there...that's a little dicey the same way a free softwareproject raising money for itself is a little dicey.It might be a necessary way to get throughcertain kinds of things and likewhat the corporate side of the world brings to the tableHere in my mind is that idea of I've got a formal process,like the process itself is an asset.If I were selling my company,that would be visibly of value to outside auditors thatwould help us arbitrate the sale. It's just empirical.Then tie that together with free software is maybe a littleunstated ethos of doing our work in the open, and you mighteven deal with some of the ick factor. that you know that for ahandler. Maybe so, but yeah, the downside to that is you'dstill need to use Emacs to run through it, right? You know,for all those cool features, yes, it would be kind of a yetanother killer app that we would have. So my domain name isorgvm, and my concept is really put org into a box, build a UIaround it, it executes things that manipulate files thatgenerate, let's say, And that's just one conceptualsolution. But I really do think this is a super fun topic. Andthat's the space. I'm not sure my idea is that wonderful. Ipersonally haven't soaked too many weekends into it. But Ijust love the way you're thinking in terms of, well, weshould think more about that. Gosh, that's great to hear.
Yeah. Yeah, I mean, just like the talk yesterday on thefuture of org, it's like, let's standardize it. Because,yeah, we don't want to have org fragmented like Markdown is.Markdown is terribly fragmented. You know, everybody'sgot different implementations. And Yeah, what I've endedup doing, I don't know if you've seen my blog, but I often I'malways just writing an org and talking to myself and writingquestions and answers and essays come out of that. And thenI'll put them on my web page and easy. It's easy to publish to aweb page. Well, I do the same thing at work, but I need to haveit marked down. I don't start Markdown though. I'm alwaysstarting an org because that, you know, I can really workthrough the problem space, you know, executing code blocksand making sure they work and all of that sort of stuff. Andthen I just export to Markdown and then go cleaned up a littlebit if I need to. And that makes sense. But I am editingMarkdown afterwards. So yeah, it would be nice. It would benice. It's just, it's all done over here as opposed to, youknow, Adding it over there, but yeah, let's think aboutevery bit as much as as that. You know, I jumped in in thespirit of yes, let's think about it. You know, your, yourcomments about, let's think about the workflows that workfor us. Wow. Does that hit home? Right? So great. Yeah. Yeah.
[00:16:17.920]Q: How does your management of "TODOs" (projects/tasks) interact with this literate mindset, any insightful things you do on that front?
Yeah. Okay. So, uh, on to do's and that sort of thing, um. Youknow, a lot is the same as it was 10 years ago. At the beginningof every sprint,my company, we're using JIRA.All jokes are valid when I say that. But I just go to its webpage. I copy all the tasks that I need to do that sprint. Iwrote a function that takes that code and reformats it as abunch of org tasks for me to do that I can just now have all myto-dos. And I start to work off of that from that point on. Soit'll reference all the projects, and I do symlinks to everycode base that I need to use. Most of the to-dos I put inside mycode block is kind of just for me, just so I can remember it.Because the work that I have to doneeds to be tracked a little morefine-grained, I guess. Yeah.
Do I use LP also on largerprojects? More files and nested directories? Yeah, Ihaven't really done nested directories, but I can now. Nowthat I've now kind of realized that I have the feature that Idemonstrated where I can just jump to any projects for aparticular project, all the org files and all the headingsshow up, that works in nested directories.Oh, okay, yeah, somebody's typing it in. Yeah, so it'sdefinitely possible. And I have now, since I recorded thetalk, I've been busy typing in and trying to extract that outof my init file and make it into a package. I'm looking for agood name right now. I'm calling it jobs, jump to projectsections. Anyway, but yeah, I think that's kind of a nice,useful feature.
[00:18:38.936]Q: Have you used Cucumber/Gherkin/BDD and do you think it has a strong overlap to what you talked about here?
Have I used Cucumber, Gherkin, and otherbehavior-driven development?Have I, I mean, I do a lot of...more test driven. I do a lot of unit tests and I just put itright in my code base because if it's in my pros, I can justshove it in there. I've got the test right next to thefunction that I'm testing. I like that so I can kind of see it.I don't tangle it out to that same source file. I tangle itsomewhere else if I tangle it at all because I don't need to. Ican just, you know, C-c that and run it. I like thataspect of it.Yeah, just keeping things together. That's the big problemI have with a lot of tests is the tests are somewhere else.It's separate from the code. I like seeing it all together,but a lot depends on how extensive it is. So for a lot of the,you know, the tests that we end up doing where, you know,you've got to do a lot of mocks and a lot of startup and teardown, that kind of thing. Yeah, that doesn't help as much.And you probably have to kind of go old school on that.
[00:19:54.600]Q: What granularity are you looking for re your org files and contents, with respect to a codebase that it tangles to, or in non-coding contexts?
What granularity I'm looking for with my org files and mysubcontent? That's a real good questionand really subjective.I change that over time. I begin by just dumping.I just dump everything in my head into a fileand then I go through and start to refine it.My goal at one point was to have an Emacs config file that wasreally small and simple. And boy, that just doesn't happen.It's just too fun to add things and try new ideas. And I foundmy files were just littered with good ideas that werehalf-baked and not finished. And so it's like, oh, I need toextract these and put them into different files so I can keepit clean. And so I think it's like with any code base, you'rejust going to keep refactoring. It's an iterative process.So having the ability to, like with an Org file, where you canarchive a subtree. Okay, this idea didn't pan out. Archiveit. I can come back to it later. Being able to just kind ofshove it somewhere else is really a nice little feature. Allright. Not a question, just a comment. We need more of yourinsightful posts and videos. Oh, thanks.I appreciate it. Yes, it's been a fun journey. And I think weare coming up on our time, actually. So that is just anamazing quiz. And it helps me from manipulating, as I said,or as I put it earlier, like my chance as an organizer, or notmanipulating, monopolizing my chance as an organizer tojust get a chance to pick your brain on all kinds of things,which is too kind, too kind. Appreciate it. It's been fun.All right, I'll try answering more questions online aswell. All right, talk to you later. And we appreciate yourbeing in a huge resource that you are to the community.Thanks to everyone for tuning in and we'll be coming over toour next talk in just a moment here. And so bear with usthrough the transition as we slip into, I think it's our, isthat our penultimate or our ultimate talk? We have one or twoleft, I'm not sure. I think we've got a couple of talks left.I'm back. Thank you, Howard. And we will be moving to the nexttalk in about six minutes. So if you need to grab some coffee,some tea, use the time wisely. And to confirm, we will haveone, two, three more talks this afternoon. So there's stillplenty to go around. See you in a bit, folks.