summaryrefslogtreecommitdiffstats
path: root/2023
diff options
context:
space:
mode:
authorEmacsConf <emacsconf-org@gnu.org>2023-12-03 07:20:44 -0500
committerEmacsConf <emacsconf-org@gnu.org>2023-12-03 07:20:44 -0500
commit2ba7da1442ea8616fd099b96d3a37af7d2900ec2 (patch)
tree347a2115aa412dbfc13140b12d799b946df4d0b1 /2023
parent314cac098677ef561087e0c14cf56a3a38344545 (diff)
downloademacsconf-wiki-2ba7da1442ea8616fd099b96d3a37af7d2900ec2.tar.xz
emacsconf-wiki-2ba7da1442ea8616fd099b96d3a37af7d2900ec2.zip
Automated commit
Diffstat (limited to '')
-rw-r--r--2023/captions/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main--chapters.vtt71
-rw-r--r--2023/captions/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main.vtt2759
-rw-r--r--2023/captions/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main--chapters.vtt20
-rw-r--r--2023/captions/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main.vtt808
-rw-r--r--2023/captions/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--main.vtt572
-rw-r--r--2023/info/core-before.md4
-rw-r--r--2023/info/devel-before.md4
-rw-r--r--2023/info/doc-after.md912
-rw-r--r--2023/info/doc-before.md39
-rw-r--r--2023/info/ref-after.md273
-rw-r--r--2023/info/ref-before.md12
-rw-r--r--2023/info/repl-before.md4
-rw-r--r--2023/info/sat-close-before.md4
-rw-r--r--2023/info/solo-before.md6
-rw-r--r--2023/info/unentangling-before.md4
-rw-r--r--2023/info/windows-before.md4
16 files changed, 5472 insertions, 24 deletions
diff --git a/2023/captions/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main--chapters.vtt b/2023/captions/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main--chapters.vtt
new file mode 100644
index 00000000..33f318c5
--- /dev/null
+++ b/2023/captions/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main--chapters.vtt
@@ -0,0 +1,71 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:57.760
+Introduction
+
+00:00:57.760 --> 00:02:14.080
+Org Babel and literate programming
+
+00:02:14.080 --> 00:04:53.479
+This presentation
+
+00:04:53.480 --> 00:06:55.779
+Getting started
+
+00:06:55.780 --> 00:07:23.499
+README
+
+00:07:23.500 --> 00:08:10.459
+Writing a code block
+
+00:08:10.460 --> 00:08:40.319
+:results none
+
+00:08:40.320 --> 00:10:36.959
+Confirmation
+
+00:10:36.960 --> 00:13:52.600
+Running blocks automatically
+
+00:13:53.000 --> 00:16:05.699
+Export options
+
+00:16:05.700 --> 00:17:25.739
+Substituting constants
+
+00:17:25.740 --> 00:20:02.960
+Getting the properties
+
+00:20:03.060 --> 00:21:05.239
+Macros
+
+00:21:05.240 --> 00:22:09.019
+Properties in practice
+
+00:22:09.020 --> 00:23:42.009
+Using a prefix
+
+00:23:42.010 --> 00:27:14.149
+Switching distributions
+
+00:27:14.150 --> 00:30:16.199
+A tour
+
+00:30:16.200 --> 00:31:09.249
+TeX and LaTeX
+
+00:31:09.250 --> 00:32:00.059
+Other prerequisites
+
+00:32:00.060 --> 00:36:20.609
+Caching
+
+00:36:20.610 --> 00:39:29.439
+Looking at the PDF
+
+00:39:29.440 --> 00:42:31.989
+Errors
+
+00:42:31.990 --> 00:42:45.200
+Final thoughts
diff --git a/2023/captions/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main.vtt b/2023/captions/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main.vtt
new file mode 100644
index 00000000..71fa30f7
--- /dev/null
+++ b/2023/captions/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main.vtt
@@ -0,0 +1,2759 @@
+WEBVTT captioned by jc, checked by sachac
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:04.320
+Hello, everyone.
+
+00:00:04.320 --> 00:00:07.280
+This talk is on literate documentation
+
+00:00:07.280 --> 00:00:10.320
+with Emacs and org-mode.
+
+00:00:10.320 --> 00:00:12.080
+I'm going to take just a moment here
+
+00:00:12.080 --> 00:00:14.279
+to unpack what I just said.
+
+00:00:14.280 --> 00:00:17.800
+Emacs, as most of us probably already know,
+
+00:00:17.800 --> 00:00:21.360
+is a powerful text editor and list programming environment
+
+00:00:21.360 --> 00:00:23.480
+from the 1970s.
+
+00:00:23.480 --> 00:00:25.800
+Chances are, if you're attending this talk,
+
+00:00:25.800 --> 00:00:28.819
+you already know a bit about Emacs.
+
+00:00:28.820 --> 00:00:32.640
+org-mode is an Emacs major mode and authoring tool
+
+00:00:32.640 --> 00:00:36.360
+that helps you write documents in a plain text markup
+
+00:00:36.360 --> 00:00:37.739
+language called Org.
+
+00:00:37.740 --> 00:00:40.200
+These Org documents can be exported
+
+00:00:40.200 --> 00:00:42.520
+to a number of different document formats,
+
+00:00:42.520 --> 00:00:48.520
+like HTML, PDF, ODT, Markdown, and more.
+
+00:00:48.520 --> 00:00:51.160
+org-mode has a lot of features.
+
+00:00:51.160 --> 00:00:54.240
+It can be an outliner, a to-do list manager,
+
+00:00:54.240 --> 00:00:57.760
+an agenda, organizer, and much more.
+
+NOTE Org Babel and literate programming
+
+00:00:57.760 --> 00:00:59.600
+Today, we're going to be demonstrating
+
+00:00:59.600 --> 00:01:03.360
+what I consider to be org-mode's killer feature called
+
+00:01:03.360 --> 00:01:04.840
+Org Babel.
+
+00:01:04.840 --> 00:01:07.879
+Babel allows you to take human language prose,
+
+00:01:07.880 --> 00:01:11.400
+computer language source code blocks, and their outputs
+
+00:01:11.400 --> 00:01:13.840
+and weave them together seamlessly
+
+00:01:13.840 --> 00:01:16.160
+to form a cohesive document.
+
+00:01:16.160 --> 00:01:19.080
+It is seriously cool.
+
+00:01:19.080 --> 00:01:21.880
+Literate documentation is a play on the term
+
+00:01:21.880 --> 00:01:25.280
+literate programming, popularized by Donald Knuth
+
+00:01:25.280 --> 00:01:27.379
+in the early 1980s.
+
+00:01:27.380 --> 00:01:29.280
+Knuth's literate programming idea
+
+00:01:29.280 --> 00:01:31.920
+was that computer programs could be
+
+00:01:31.920 --> 00:01:34.880
+expressed in a natural language and be
+
+00:01:34.880 --> 00:01:38.800
+human-readable documents rather than written exclusively
+
+00:01:38.800 --> 00:01:40.799
+for machines to read.
+
+00:01:40.800 --> 00:01:43.000
+In a traditional program, you might
+
+00:01:43.000 --> 00:01:45.680
+have a bunch of machine-readable source code
+
+00:01:45.680 --> 00:01:48.560
+and a handful of human-readable comments,
+
+00:01:48.560 --> 00:01:51.600
+which attempt to describe what the program is doing.
+
+00:01:51.600 --> 00:01:54.360
+Literate programming flips this on its head.
+
+00:01:54.360 --> 00:01:56.680
+A literate program is a document that
+
+00:01:56.680 --> 00:02:01.160
+describes how the program works with machine-readable source
+
+00:02:01.160 --> 00:02:02.880
+code blocks inside of it.
+
+00:02:02.880 --> 00:02:04.800
+These source code blocks are later
+
+00:02:04.800 --> 00:02:08.440
+tangled out of the document and submitted to the machine
+
+00:02:08.440 --> 00:02:14.080
+either to be compiled or interpreted and ultimately run.
+
+NOTE This presentation
+
+00:02:14.080 --> 00:02:15.600
+Throughout this presentation, you'll
+
+00:02:15.600 --> 00:02:19.400
+see my browser window here on the left side of the screen.
+
+00:02:19.400 --> 00:02:22.240
+And on the right side, I've got a terminal session
+
+00:02:22.240 --> 00:02:23.960
+running tmux.
+
+00:02:23.960 --> 00:02:28.039
+This allows us to have a virtual terminal window connected
+
+00:02:28.040 --> 00:02:35.040
+to two separate Linux machines, one running Ubuntu Server 2204
+
+00:02:35.040 --> 00:02:39.720
+and another running Fedora Server 38.
+
+00:02:39.720 --> 00:02:43.240
+I've specifically chosen these two distributions for my demo
+
+00:02:43.440 --> 00:02:46.720
+because they are representative of the two dominant flavors
+
+00:02:46.720 --> 00:02:49.880
+of GNU Linux, Debian and RedHat.
+
+00:02:49.880 --> 00:02:53.120
+In both cases, these are bare-bones server additions
+
+00:02:53.120 --> 00:02:55.440
+with the stock packages installed.
+
+00:02:55.440 --> 00:03:00.200
+I've manually installed a few packages like Git, emacs-noex
+
+00:03:00.200 --> 00:03:04.000
+to get the terminal version of emacs, and tmux.
+
+00:03:04.000 --> 00:03:06.000
+But otherwise, these Linux installs
+
+00:03:06.000 --> 00:03:08.719
+are what you'd get right out of the box.
+
+00:03:08.720 --> 00:03:12.480
+For this demo, I've created a literate org-mode document
+
+00:03:12.480 --> 00:03:16.360
+that describes how to build GNU Emacs from its source code
+
+00:03:16.360 --> 00:03:19.939
+on both Debian and RedHat-based systems.
+
+00:03:19.940 --> 00:03:22.920
+While both operating systems are very similar,
+
+00:03:22.920 --> 00:03:25.440
+they differ substantially on which packages
+
+00:03:25.440 --> 00:03:29.080
+are installed out of the box, how optional packages are
+
+00:03:29.080 --> 00:03:32.600
+named, searched, and installed, and of course,
+
+00:03:32.600 --> 00:03:34.240
+the distributions have different names,
+
+00:03:34.240 --> 00:03:36.800
+like Ubuntu or Fedora.
+
+00:03:36.800 --> 00:03:39.200
+I chose building Emacs from source
+
+00:03:39.200 --> 00:03:41.640
+as a topic for this demonstration
+
+00:03:41.640 --> 00:03:43.800
+because while the process is largely
+
+00:03:43.800 --> 00:03:46.880
+the same on both RedHat and Debian,
+
+00:03:46.880 --> 00:03:49.360
+there are a lot of minor little differences
+
+00:03:49.360 --> 00:03:52.680
+that need to be accounted for, which really prohibits you
+
+00:03:52.680 --> 00:03:57.120
+from hard coding names of packages and package management
+
+00:03:57.120 --> 00:04:01.200
+tools and distributions into your document.
+
+00:04:01.200 --> 00:04:05.320
+I suppose you could create two versions of the same document,
+
+00:04:05.320 --> 00:04:09.960
+one specifically for RedHat and one specifically for Debian,
+
+00:04:09.960 --> 00:04:13.280
+but that would be really tedious to maintain.
+
+00:04:13.280 --> 00:04:16.280
+Like if, for example, you updated some prose
+
+00:04:16.280 --> 00:04:18.720
+in one document, you'd have to remember
+
+00:04:18.720 --> 00:04:20.280
+to do it in the other one too.
+
+00:04:20.280 --> 00:04:22.920
+And if you weren't careful, the two documents
+
+00:04:22.920 --> 00:04:25.259
+could drift out of sync.
+
+00:04:25.260 --> 00:04:27.720
+In this demo, I'll show you techniques
+
+00:04:27.720 --> 00:04:30.960
+for creating dynamic, literate documents that
+
+00:04:30.960 --> 00:04:34.619
+can change based on parameters and constants embedded
+
+00:04:34.620 --> 00:04:38.439
+into the non-exported regions of the document.
+
+00:04:38.440 --> 00:04:41.800
+I'll show how with a single org-mode source document,
+
+00:04:41.800 --> 00:04:44.800
+you can press a couple of keys to configure
+
+00:04:44.800 --> 00:04:48.720
+it to export a RedHat-specific version of my building
+
+00:04:48.720 --> 00:04:53.479
+Emacs from source essay or a Debian-specific version.
+
+NOTE Getting started
+
+00:04:53.480 --> 00:04:55.320
+All right, let's get started.
+
+00:04:55.320 --> 00:04:58.720
+We'll begin by firing up a new terminal Emacs session
+
+00:04:58.720 --> 00:05:00.639
+on my Ubuntu machine.
+
+00:05:00.640 --> 00:05:04.600
+Now, I installed Emacs on this machine using apt-get.
+
+00:05:04.600 --> 00:05:07.960
+And doing that, you get version 27.1,
+
+00:05:07.960 --> 00:05:10.640
+which is, hey, only two major versions
+
+00:05:10.640 --> 00:05:13.010
+behind the current version of Emacs.
+
+00:05:13.011 --> 00:05:15.000
+This is another reason why I thought
+
+00:05:15.000 --> 00:05:18.080
+writing a guide on how to build Emacs from source code
+
+00:05:18.080 --> 00:05:19.719
+might be a good idea.
+
+00:05:19.720 --> 00:05:22.720
+You can get a much newer version of Emacs on Ubuntu
+
+00:05:22.720 --> 00:05:25.800
+if you install it via Snap, but, uh, Snaps.
+
+00:05:25.800 --> 00:05:28.239
+Don't get me started.
+
+00:05:28.240 --> 00:05:30.921
+Now, I wanted to use a completely vanilla
+
+00:05:30.922 --> 00:05:34.619
+terminal mode install of Emacs for this demonstration
+
+00:05:34.620 --> 00:05:38.040
+because my personal Emacs config has a ton of packages
+
+00:05:38.040 --> 00:05:41.199
+installed and is heavily modified.
+
+00:05:41.200 --> 00:05:43.640
+I want folks to be able to follow along
+
+00:05:43.640 --> 00:05:47.579
+with a bog-standard, out-of-the-box Emacs config.
+
+00:05:47.580 --> 00:05:49.520
+The Emacs config on this Ubuntu machine
+
+00:05:49.520 --> 00:05:51.200
+has just two settings.
+
+00:05:51.200 --> 00:05:55.240
+I require org-tempo because my fingers are hardwired
+
+00:05:55.240 --> 00:05:58.719
+to use some of the handy shortcuts that it provides.
+
+00:05:58.720 --> 00:06:00.520
+And I also turn off the menu bar
+
+00:06:00.520 --> 00:06:03.139
+because I just can't stand to look at it.
+
+00:06:03.140 --> 00:06:07.040
+Let's begin by opening a file called buildemacs.org,
+
+00:06:07.040 --> 00:06:08.480
+which will be the source code
+
+00:06:08.480 --> 00:06:11.079
+for our literate org-mode document.
+
+00:06:11.080 --> 00:06:12.840
+Now, in preparation for this talk,
+
+00:06:12.840 --> 00:06:14.960
+I've already written this document,
+
+00:06:14.960 --> 00:06:17.979
+and we'll take a look at the finished product
+
+00:06:17.980 --> 00:06:19.160
+here in a bit, but let's first take a look
+
+00:06:19.160 --> 00:06:22.408
+at how we might approach this task.
+
+00:06:22.409 --> 00:06:24.400
+We'll start at the top of the document
+
+00:06:24.400 --> 00:06:27.119
+by filling out some export keywords.
+
+00:06:27.120 --> 00:06:30.520
+These keywords are something that every backend exporter,
+
+00:06:30.520 --> 00:06:35.000
+be it LaTeX or plain text or ODT or whatever, understands,
+
+00:06:35.000 --> 00:06:38.120
+and they're essentially document metadata.
+
+00:06:38.120 --> 00:06:42.120
+As you can see, I'm typing `#+`
+
+00:06:42.120 --> 00:06:43.760
+followed by a couple characters
+
+00:06:43.760 --> 00:06:45.880
+and then `M-TAB` to auto-complete.
+
+00:06:45.880 --> 00:06:50.360
+If you hit #+ by itself and then M-TAB,
+
+00:06:50.360 --> 00:06:53.119
+you can see all the possible completions.
+
+00:06:53.120 --> 00:06:55.779
+And as you can see, there's a lot.
+
+NOTE README
+
+00:06:55.780 --> 00:06:58.520
+The next thing we're gonna do is make a README section
+
+00:06:58.520 --> 00:06:59.760
+at the top of this document.
+
+00:06:59.760 --> 00:07:02.240
+This section is intended for folks
+
+00:07:02.240 --> 00:07:04.280
+who are looking at the org-mode document,
+
+00:07:04.280 --> 00:07:06.679
+trying to figure out what it's for.
+
+00:07:06.680 --> 00:07:09.600
+We don't want to actually export the section heading,
+
+00:07:09.600 --> 00:07:13.859
+so we're gonna tag it with the :noexport: tag.
+
+00:07:13.860 --> 00:07:15.640
+And then here, we just write something quick
+
+00:07:15.640 --> 00:07:17.760
+to let folks know that this document
+
+00:07:17.760 --> 00:07:19.800
+can potentially execute code
+
+00:07:19.800 --> 00:07:23.499
+and just a little something about what the document is for.
+
+NOTE Writing a code block
+
+00:07:23.500 --> 00:07:26.059
+Okay, so now that we've written some text,
+
+00:07:26.060 --> 00:07:29.599
+let's try our hand at writing a code block.
+
+00:07:29.600 --> 00:07:31.288
+I'm getting pretty sick of looking at
+
+00:07:31.289 --> 00:07:32.939
+the default Emacs theme.
+
+00:07:32.940 --> 00:07:35.440
+All that blue and purple in the document
+
+00:07:35.440 --> 00:07:37.879
+makes it look bruised.
+
+00:07:37.880 --> 00:07:40.320
+Let's make an Emacs Lisp code block
+
+00:07:40.320 --> 00:07:41.400
+that switches the theme
+
+00:07:41.400 --> 00:07:44.560
+to one of my favorite built-in themes, Leuven.
+
+00:07:44.560 --> 00:07:48.400
+Leuven was created by my man, Fabrice Niessen,
+
+00:07:48.400 --> 00:07:52.120
+who I personally have learned a ton of org-mode stuff about
+
+00:07:52.120 --> 00:07:54.039
+just by studying his work.
+
+00:07:54.040 --> 00:07:56.360
+Now, if we cruise back up to the code block,
+
+00:07:56.360 --> 00:07:58.840
+we should be able to hit `C-c C-c`,
+
+00:07:58.840 --> 00:08:00.379
+and have it execute.
+
+00:08:00.380 --> 00:08:03.880
+And there you have it, a high-contrast color theme
+
+00:08:03.880 --> 00:08:06.979
+that was designed to look great in org-mode.
+
+00:08:06.980 --> 00:08:08.080
+So that's great and all,
+
+00:08:08.080 --> 00:08:10.459
+but there are a couple of things I don't like.
+
+NOTE :results none
+
+00:08:10.460 --> 00:08:13.599
+First of all, we don't need to see a #+RESULTS block here,
+
+00:08:13.600 --> 00:08:15.280
+and that's because we're not really interested
+
+00:08:15.280 --> 00:08:18.720
+in what the Emacs Lisp function `load-theme` returns.
+
+00:08:18.720 --> 00:08:22.200
+I mean, it's great it returned t and all to indicate success,
+
+00:08:22.200 --> 00:08:23.720
+we just don't need to see it.
+
+00:08:23.720 --> 00:08:26.560
+We can slap a `:results none` header arg
+
+00:08:26.560 --> 00:08:30.039
+on the code block to keep things nice and clean.
+
+00:08:30.040 --> 00:08:32.560
+There are a lot of different header args,
+
+00:08:32.560 --> 00:08:35.360
+and I often confuse and misremember them.
+
+00:08:35.360 --> 00:08:38.920
+So I'll always refer back to the org-mode manual
+
+00:08:38.920 --> 00:08:40.319
+when working with them.
+
+NOTE Confirmation
+
+00:08:40.320 --> 00:08:42.160
+The second thing I don't like is that
+
+00:08:42.160 --> 00:08:45.999
+when we hit C-c C-c to execute the block,
+
+00:08:46.000 --> 00:08:49.600
+Emacs prompted us if we really wanted to run the block.
+
+00:08:49.600 --> 00:08:52.040
+Emacs Lisp is Emacs' mother tongue,
+
+00:08:52.040 --> 00:08:53.920
+and I don't wanna be hassled when speaking
+
+00:08:53.920 --> 00:08:55.379
+my native language.
+
+00:08:55.380 --> 00:08:57.520
+There's a variable that controls this
+
+00:08:57.520 --> 00:09:00.680
+called `org-confirm-babel-evaluate`.
+
+00:09:00.680 --> 00:09:03.960
+And this can be either set to t or nil
+
+00:09:03.960 --> 00:09:06.840
+to either always confirm or never confirm.
+
+00:09:06.840 --> 00:09:10.920
+If however, you provided a lambda, an anonymous function,
+
+00:09:10.920 --> 00:09:14.560
+Org will call your function with the name of the language
+
+00:09:14.560 --> 00:09:16.840
+and the source block that it's about to run.
+
+00:09:16.840 --> 00:09:19.080
+And your function can make the decision
+
+00:09:19.080 --> 00:09:24.200
+about if Emacs should ask you for confirmation or not.
+
+00:09:24.200 --> 00:09:27.840
+What I'm doing here is setting `org-confirm-babel-evaluate`
+
+00:09:27.840 --> 00:09:30.539
+as a "file local variable".
+
+00:09:30.540 --> 00:09:33.320
+This means whenever the file is opened by Emacs,
+
+00:09:33.320 --> 00:09:38.059
+it'll set this variable to be a lambda that returns nil,
+
+00:09:38.060 --> 00:09:42.859
+meaning don't confirm, on Elisp code blocks.
+
+00:09:42.860 --> 00:09:45.920
+As you can see, the variable is currently set
+
+00:09:45.920 --> 00:09:50.879
+to its default value of t, meaning always confirm.
+
+00:09:50.880 --> 00:09:53.640
+Now if we save the buffer, exit Emacs,
+
+00:09:53.640 --> 00:09:55.040
+and pop back in again,
+
+00:09:55.040 --> 00:10:00.120
+`org-confirm-babel-evaluate` should be set how we like it.
+
+00:10:00.120 --> 00:10:02.640
+We were however prompted for confirmation
+
+00:10:02.640 --> 00:10:04.400
+on setting the file-local variable,
+
+00:10:04.400 --> 00:10:06.280
+which controls if we're prompted
+
+00:10:06.280 --> 00:10:09.699
+for Elisp source code block evaluation.
+
+00:10:09.700 --> 00:10:12.679
+I feel like there's a Yo Dawg joke here somewhere.
+
+00:10:12.680 --> 00:10:15.240
+When we were prompted, we hit the exclamation mark,
+
+00:10:15.240 --> 00:10:18.400
+which automatically marks this variable as being safe.
+
+00:10:18.400 --> 00:10:21.520
+So you won't be bothered the next time you open this file.
+
+00:10:21.520 --> 00:10:26.760
+This variable is called `safe-local-variable-values`
+
+00:10:26.760 --> 00:10:29.560
+and if we pop over to our .emacs file,
+
+00:10:29.560 --> 00:10:32.520
+you can see that Emacs' customize tooling
+
+00:10:32.520 --> 00:10:36.959
+helpfully updated this variable in our config file for us.
+
+NOTE Running blocks automatically
+
+00:10:36.960 --> 00:10:38.120
+Now that's great and all,
+
+00:10:38.120 --> 00:10:42.120
+but I really don't like having to hit `C-c C-c`
+
+00:10:42.120 --> 00:10:45.160
+on that source block every time I open this document
+
+00:10:45.160 --> 00:10:47.739
+just to bring up the Leuven theme.
+
+00:10:47.740 --> 00:10:50.520
+Let's have this source block run automatically
+
+00:10:50.520 --> 00:10:53.179
+every time the document is opened.
+
+00:10:53.180 --> 00:10:54.999
+Now I know what you're thinking.
+
+00:10:55.000 --> 00:10:57.640
+Shouldn't you just put all of this configuration stuff
+
+00:10:57.640 --> 00:11:01.159
+in your .emacs file and keep it out of the document?
+
+00:11:01.160 --> 00:11:04.760
+Well, that's what I've done with my personal Emacs config,
+
+00:11:04.760 --> 00:11:08.160
+but we want this document to be able to be used by folks
+
+00:11:08.160 --> 00:11:11.040
+with a completely vanilla Emacs setup,
+
+00:11:11.040 --> 00:11:13.440
+or even a completely tricked out Emacs setup,
+
+00:11:13.440 --> 00:11:16.059
+so we can't assume anything.
+
+00:11:16.060 --> 00:11:19.800
+The idea is if the Emacs user who opens the document
+
+00:11:19.800 --> 00:11:22.400
+agrees to setting all of the variables
+
+00:11:22.400 --> 00:11:24.359
+and running all of the code within,
+
+00:11:24.360 --> 00:11:26.560
+they'll be able to export the document
+
+00:11:26.560 --> 00:11:28.840
+as well as run all of the code blocks inside of it
+
+00:11:28.840 --> 00:11:30.799
+just as we intended.
+
+00:11:30.800 --> 00:11:33.880
+And the differences in base Emacs configuration
+
+00:11:33.880 --> 00:11:35.979
+will be completely minimized.
+
+00:11:35.980 --> 00:11:39.080
+Now it's worth pointing out that the file-local variables
+
+00:11:39.080 --> 00:11:43.023
+we're setting here are local, in this case, buffer-local.
+
+00:11:43.024 --> 00:11:45.280
+The configuration we use in this document
+
+00:11:45.280 --> 00:11:48.280
+won't override someone's carefully constructed
+
+00:11:48.280 --> 00:11:49.499
+org-mode setup.
+
+00:11:49.500 --> 00:11:50.800
+The first thing we're gonna wanna do
+
+00:11:51.000 --> 00:11:53.080
+in order to make this block execute
+
+00:11:53.080 --> 00:11:55.988
+when the document is loaded is to give it a name.
+
+00:11:55.989 --> 00:11:58.800
+It's always a good idea to give every source block
+
+00:11:58.800 --> 00:12:01.337
+you create in your document a unique name,
+
+00:12:01.338 --> 00:12:03.400
+even if you don't refer to it elsewhere.
+
+00:12:03.700 --> 00:12:06.960
+I do this because when I'm debugging my documents,
+
+00:12:07.160 --> 00:12:10.019
+Emacs will prompt me about running a block.
+
+00:12:10.020 --> 00:12:12.960
+If the block has a name, Emacs mentions it,
+
+00:12:12.960 --> 00:12:15.960
+and I know there's a problem with the result caching
+
+00:12:15.960 --> 00:12:17.840
+or something with the "foo" block.
+
+00:12:17.840 --> 00:12:20.280
+But if the block doesn't have a name,
+
+00:12:20.280 --> 00:12:22.160
+it can be really hard to figure out
+
+00:12:22.160 --> 00:12:24.579
+which block Emacs is complaining about.
+
+00:12:24.580 --> 00:12:27.459
+So I always name my blocks.
+
+00:12:27.460 --> 00:12:30.360
+Now we're gonna add another file local variable,
+
+00:12:30.360 --> 00:12:32.115
+but this one is special.
+
+00:12:32.116 --> 00:12:34.360
+If your "variable"
+
+00:12:34.360 --> 00:12:36.320
+just happens to be named "eval",
+
+00:12:36.320 --> 00:12:38.760
+it means that Emacs should evaluate
+
+00:12:38.760 --> 00:12:40.800
+the Lisp expression that follows.
+
+00:12:40.800 --> 00:12:43.240
+Here we'll use the progn function
+
+00:12:43.240 --> 00:12:46.040
+to sequentially run two elisp functions
+
+00:12:46.040 --> 00:12:48.760
+and return the value of the last one executed.
+
+00:12:48.760 --> 00:12:53.320
+The first function is `org-babel-goto-named-source-block`,
+
+00:12:53.320 --> 00:12:55.440
+which jumps us to the startup block.
+
+00:12:55.440 --> 00:12:59.280
+The second one is `org-babel-execute-src-block`,
+
+00:12:59.280 --> 00:13:02.092
+which executes the current source block.
+
+00:13:02.093 --> 00:13:03.630
+That should get the job done.
+
+00:13:03.631 --> 00:13:05.840
+Now all we have to do is save the document,
+
+00:13:05.840 --> 00:13:08.199
+exit Emacs, jump back in,
+
+00:13:08.200 --> 00:13:10.280
+and once we've confirmed that we're willing
+
+00:13:10.280 --> 00:13:14.239
+to run the new "eval" line in our file local variables,
+
+00:13:14.240 --> 00:13:15.859
+we're good to go.
+
+00:13:15.860 --> 00:13:18.480
+Now if we want to add new configuration stuff
+
+00:13:18.480 --> 00:13:21.839
+to the document, we can just add it to the startup block
+
+00:13:21.840 --> 00:13:24.880
+and not have to muck about with confirmations
+
+00:13:24.880 --> 00:13:28.679
+or adding new file-local variables or whatever.
+
+00:13:28.680 --> 00:13:31.960
+And just like before, we'll let Emacs' customize system
+
+00:13:31.960 --> 00:13:34.939
+save this decision to our .emacs file.
+
+00:13:34.940 --> 00:13:37.760
+Now that all that business with confirmations,
+
+00:13:37.760 --> 00:13:40.080
+file-local variables, and the startup block
+
+00:13:40.080 --> 00:13:41.120
+are out of the way,
+
+00:13:41.120 --> 00:13:44.120
+we can get on with writing our introduction.
+
+00:13:44.120 --> 00:13:47.880
+We'll create a new top level headline called introduction
+
+00:13:47.880 --> 00:13:51.440
+and explain to the reader of the exported document
+
+00:13:51.440 --> 00:13:52.600
+what this is all about.
+
+NOTE Export options
+
+00:13:53.000 --> 00:13:55.640
+Now as you can see, we've actually hard-coded
+
+00:13:55.640 --> 00:13:58.280
+the name of the Linux distro in our prose.
+
+00:13:58.280 --> 00:14:00.880
+I promised you a single document that could be
+
+00:14:00.880 --> 00:14:03.720
+for either RedHat or Debian distros,
+
+00:14:03.720 --> 00:14:05.319
+so we can't have this.
+
+00:14:05.320 --> 00:14:08.840
+Astute members in the audience have probably been uneasy
+
+00:14:08.840 --> 00:14:11.280
+ever since I hard coded the name "Debian"
+
+00:14:11.280 --> 00:14:13.859
+in the README section above.
+
+00:14:13.860 --> 00:14:17.520
+One way of solving this problem is by using exclude tags.
+
+00:14:17.520 --> 00:14:21.960
+Let's add the `#+EXCLUDE_TAGS` export keyword to our document.
+
+00:14:21.960 --> 00:14:24.200
+This keyword tells the exporter,
+
+00:14:24.200 --> 00:14:27.959
+"Hey, if you see a headline tagged with any of these tags,
+
+00:14:27.960 --> 00:14:29.600
+don't export it."
+
+00:14:29.600 --> 00:14:33.559
+By default, the tag `:noexport:` is excluded.
+
+00:14:33.560 --> 00:14:36.480
+And if you'll notice, we tagged our README section
+
+00:14:36.480 --> 00:14:38.360
+with that tag, so it doesn't show up
+
+00:14:38.360 --> 00:14:40.339
+in the exported document.
+
+00:14:40.340 --> 00:14:42.280
+We'll keep this tag in the list,
+
+00:14:42.280 --> 00:14:47.080
+but we'll also add the tag `:redhat:` as a tag to exclude.
+
+00:14:47.080 --> 00:14:50.400
+Now it's just a matter of creating two introduction
+
+00:14:50.400 --> 00:14:53.960
+sections, one for Debian, one for RedHat.
+
+00:14:53.960 --> 00:14:56.520
+And if you want the RedHat version of the document,
+
+00:14:56.520 --> 00:14:59.200
+you can just modify the `#+EXCLUDE_TAGS` line
+
+00:14:59.200 --> 00:15:00.440
+at the top of the document.
+
+00:15:00.440 --> 00:15:02.339
+Awesome, right?
+
+00:15:02.340 --> 00:15:03.539
+Right?
+
+00:15:03.540 --> 00:15:05.544
+OK, this is not that great.
+
+00:15:05.545 --> 00:15:07.387
+Well, it does work.
+
+00:15:07.388 --> 00:15:10.081
+And you can see if we export the document,
+
+00:15:10.082 --> 00:15:12.840
+we'll get something that only references Debian,
+
+00:15:12.840 --> 00:15:15.188
+and the `:noexport:` and `:redhat:`
+
+00:15:15.189 --> 00:15:17.450
+tagged headlines are omitted.
+
+00:15:17.451 --> 00:15:19.319
+This strategy would work great
+
+00:15:19.320 --> 00:15:22.120
+when the RedHat- and Debian-specific sections
+
+00:15:22.120 --> 00:15:24.400
+are substantially different, but that's not
+
+00:15:24.400 --> 00:15:26.198
+the case with the introduction.
+
+00:15:26.199 --> 00:15:28.640
+We definitely don't want to have to maintain
+
+00:15:28.640 --> 00:15:30.824
+two distinct introductions.
+
+00:15:30.825 --> 00:15:34.080
+I also noticed that the export tags are included
+
+00:15:34.080 --> 00:15:36.519
+in the exported document.
+
+00:15:36.520 --> 00:15:38.720
+That's a terrible default. We'll fix that,
+
+00:15:38.720 --> 00:15:42.040
+and we'll also ensure that my email address appears
+
+00:15:42.040 --> 00:15:43.371
+at the top of the document.
+
+00:15:43.372 --> 00:15:45.440
+Let's also take this opportunity to get rid
+
+00:15:45.440 --> 00:15:47.354
+of the table of contents.
+
+00:15:47.355 --> 00:15:48.867
+We don't need it.
+
+00:15:48.868 --> 00:15:51.120
+These are all export option settings
+
+00:15:51.120 --> 00:15:53.800
+and can be modified using the options keyword
+
+00:15:53.800 --> 00:15:55.508
+at the top of the doc.
+
+00:15:55.509 --> 00:15:57.480
+The manual is really your friend here,
+
+00:15:57.480 --> 00:16:00.979
+as there are a ton of export options.
+
+00:16:00.980 --> 00:16:03.120
+Now when we export the document again,
+
+00:16:03.120 --> 00:16:05.699
+it should look a lot better.
+
+NOTE Substituting constants
+
+00:16:05.700 --> 00:16:09.059
+Now that we've cleaned up the look of the exported document,
+
+00:16:09.060 --> 00:16:10.640
+we'll take a look at a better way
+
+00:16:10.640 --> 00:16:13.377
+of solving the problem with the introduction.
+
+00:16:13.378 --> 00:16:15.518
+Thinking like a programmer for a moment,
+
+00:16:15.519 --> 00:16:19.734
+what I really want here is a way of specifying a constant.
+
+00:16:19.735 --> 00:16:22.640
+Rather than hard-coding the name "Debian" or "RedHat"
+
+00:16:22.640 --> 00:16:24.569
+or whatever into my document,
+
+00:16:24.570 --> 00:16:28.234
+I want to substitute that text with a symbolic constant,
+
+00:16:28.235 --> 00:16:31.960
+named something like "distro", that can dynamically change
+
+00:16:31.960 --> 00:16:36.120
+to "Debian" or "RedHat" or "Slackware" or whatever,
+
+00:16:36.120 --> 00:16:38.689
+depending on how the document is configured.
+
+00:16:38.690 --> 00:16:41.640
+In the past, I've come up with some pretty cumbersome ways
+
+00:16:41.640 --> 00:16:44.640
+of doing this, but eventually I stumbled upon the idea
+
+00:16:44.640 --> 00:16:46.639
+of using Org-mode properties
+
+00:16:46.640 --> 00:16:49.409
+as a way of storing these constants.
+
+00:16:49.410 --> 00:16:53.059
+Like it says in the docs, properties are key-value pairs
+
+00:16:53.060 --> 00:16:55.169
+that are associated with an entry
+
+00:16:55.170 --> 00:16:58.379
+and they live in a collapsible properties drawer.
+
+00:16:58.380 --> 00:17:00.699
+Let's do a bit of cleanup on our document
+
+00:17:00.700 --> 00:17:02.600
+and we'll put things into sections.
+
+00:17:02.600 --> 00:17:14.000
+We'll also add a section for document constants.
+
+00:17:14.000 --> 00:17:19.560
+And that's where we'll put the properties drawer
+
+00:17:19.560 --> 00:17:25.739
+with the "distro" property.
+
+NOTE Getting the properties
+
+00:17:25.740 --> 00:17:27.120
+Now the question is,
+
+00:17:27.120 --> 00:17:30.099
+how do we reference these properties in the document?
+
+00:17:30.100 --> 00:17:32.520
+It turns out there's an Elisp function
+
+00:17:32.520 --> 00:17:35.440
+called `org-property-values`, which does what we want.
+
+00:17:35.440 --> 00:17:38.840
+If we run it and give it the name of our property,
+
+00:17:38.840 --> 00:17:42.679
+it returns a list with the string "Debian" in it.
+
+00:17:42.680 --> 00:17:45.919
+It's worth noting that this function is named
+
+00:17:45.920 --> 00:17:49.989
+`org-property-values` with values being plural.
+
+00:17:49.990 --> 00:17:52.889
+In org-mode, there could be a property named "foo"
+
+00:17:52.890 --> 00:17:55.880
+that has different values depending on which heading level
+
+00:17:55.880 --> 00:17:57.609
+you're at in the document,
+
+00:17:57.610 --> 00:17:59.720
+which is why the function returns a list.
+
+00:17:59.720 --> 00:18:01.289
+For our purposes though,
+
+00:18:01.290 --> 00:18:04.480
+we can just pull off the first value in the list with car
+
+00:18:04.480 --> 00:18:05.680
+and we're good to go.
+
+00:18:05.680 --> 00:18:10.040
+Now we'll make an Emacs Lisp list function called `get_prop`
+
+00:18:10.040 --> 00:18:11.440
+that does just that.
+
+00:18:11.440 --> 00:18:14.160
+This function takes one argument called `prop`,
+
+00:18:14.160 --> 00:18:15.920
+which is the property to look up
+
+00:18:15.920 --> 00:18:18.519
+and we'll give it a default value of "distro".
+
+00:18:18.520 --> 00:18:20.960
+So we can hit `C-c C-c` on the block
+
+00:18:20.960 --> 00:18:23.149
+to verify that it works.
+
+00:18:23.150 --> 00:18:25.480
+Now we just have to make an inline call
+
+00:18:25.480 --> 00:18:26.920
+to our `get_prop` function
+
+00:18:26.920 --> 00:18:29.559
+within the prose of the introduction section.
+
+00:18:29.560 --> 00:18:31.659
+And that should get us much closer
+
+00:18:31.660 --> 00:18:35.619
+to not hard coding distro names into our document.
+
+00:18:35.620 --> 00:18:36.869
+But before we do that,
+
+00:18:36.870 --> 00:18:39.849
+I need to clean up something that's been bothering me.
+
+00:18:39.850 --> 00:18:42.909
+By default, Emacs' `fill-column` variable
+
+00:18:42.910 --> 00:18:44.989
+is set to 70 characters,
+
+00:18:44.990 --> 00:18:47.720
+which may have been appropriate for 1970,
+
+00:18:47.720 --> 00:18:51.319
+but it's not great for 2023.
+
+00:18:51.320 --> 00:18:53.920
+We'll just cruise up to our startup block
+
+00:18:53.920 --> 00:18:56.539
+and set the variable there.
+
+00:18:56.540 --> 00:18:58.800
+We'll hit `C-c C-c`,
+
+00:18:58.800 --> 00:19:02.289
+and now our document will wrap at 100 columns,
+
+00:19:02.290 --> 00:19:05.829
+which for our purposes, I think is much more reasonable.
+
+00:19:05.830 --> 00:19:09.320
+The org-mode syntax for making an inline function call
+
+00:19:09.320 --> 00:19:13.059
+within the prose of your document is `call_`,
+
+00:19:13.060 --> 00:19:15.000
+followed by the name of the function,
+
+00:19:15.000 --> 00:19:17.040
+some optional header arguments,
+
+00:19:17.040 --> 00:19:19.719
+and then the function arguments.
+
+00:19:19.720 --> 00:19:21.680
+Now, when we export the document,
+
+00:19:21.680 --> 00:19:26.049
+we see that it's replaced our previously hard coded "Debian"
+
+00:19:26.050 --> 00:19:29.409
+with the value from the property. Huzzah!
+
+00:19:29.410 --> 00:19:32.959
+Now this is close to, but not exactly what we want.
+
+00:19:32.960 --> 00:19:36.720
+You can see that "Debian" is surrounded by a backtick
+
+00:19:36.720 --> 00:19:37.800
+and a single quote,
+
+00:19:37.800 --> 00:19:40.320
+which is the plain text exporters way
+
+00:19:40.320 --> 00:19:43.029
+of showing you verbatim text.
+
+00:19:43.030 --> 00:19:45.600
+In more sophisticated document backends,
+
+00:19:45.600 --> 00:19:49.379
+verbatim text is rendered in monospace.
+
+00:19:49.380 --> 00:19:54.080
+We can fix that by adding a ":results raw" header argument
+
+00:19:54.080 --> 00:19:56.459
+to the inline call.
+
+00:19:56.460 --> 00:19:58.239
+Now, when we export the document,
+
+00:19:58.240 --> 00:20:00.289
+it looks like what we'd expect.
+
+00:20:00.290 --> 00:20:02.960
+Now this is getting better, but it's still not great.
+
+NOTE Macros
+
+00:20:03.060 --> 00:20:05.840
+The `call_` syntax is pretty cumbersome,
+
+00:20:05.840 --> 00:20:08.560
+and it's a lot to type every time we want
+
+00:20:08.560 --> 00:20:09.849
+to reference a constant
+
+00:20:09.850 --> 00:20:13.219
+and not have it be marked up as verbatim.
+
+00:20:13.220 --> 00:20:17.169
+This is where org-mode macros come to our rescue.
+
+00:20:17.170 --> 00:20:19.469
+If we head to the top of the document,
+
+00:20:19.470 --> 00:20:21.480
+we can create a couple of macros
+
+00:20:21.480 --> 00:20:24.699
+using the `#+MACRO:` export keyword.
+
+00:20:24.700 --> 00:20:27.600
+We'll define two macros with short names.
+
+00:20:27.600 --> 00:20:30.240
+One named "p" for "property",
+
+00:20:30.240 --> 00:20:34.640
+and the other one named "pr" for "property raw".
+
+00:20:34.640 --> 00:20:39.160
+Org-mode macros are expanded when the document is exported,
+
+00:20:39.160 --> 00:20:41.640
+and any positional arguments provided
+
+00:20:41.640 --> 00:20:43.559
+are referenced by their number.
+
+00:20:43.860 --> 00:20:45.160
+Now in the introduction,
+
+00:20:45.160 --> 00:20:47.880
+we can use the macro replacement syntax,
+
+00:20:47.880 --> 00:20:49.800
+which is three curly braces,
+
+00:20:49.800 --> 00:20:52.760
+followed by the macro name and any arguments,
+
+00:20:52.760 --> 00:20:55.559
+and then three ending curly braces.
+
+00:20:55.560 --> 00:20:58.699
+You see why I kept the macro name short.
+
+00:20:58.700 --> 00:21:01.280
+That's six curly braces in total we're typing,
+
+00:21:01.280 --> 00:21:05.239
+which still takes up a fair amount of space.
+
+NOTE Properties in practice
+
+00:21:05.240 --> 00:21:07.120
+Now let's take a look at how we might use
+
+00:21:07.120 --> 00:21:09.159
+these properties in practice.
+
+00:21:09.160 --> 00:21:10.920
+Debian and RedHat distros differ
+
+00:21:11.120 --> 00:21:12.929
+on how they install packages.
+
+00:21:12.930 --> 00:21:16.120
+So we're gonna want an "install" property,
+
+00:21:16.120 --> 00:21:24.579
+where in Debian we use `sudo apt-get install -qq`,
+
+00:21:24.580 --> 00:21:26.939
+and on RedHat we'll use something like
+
+00:21:26.940 --> 00:21:33.119
+`sudo dnf install -y`.
+
+00:21:33.120 --> 00:21:35.329
+Now development packages
+
+00:21:35.330 --> 00:21:38.049
+also have a different naming convention.
+
+00:21:38.050 --> 00:21:40.760
+For example, the `ncurses` library on Debian
+
+00:21:40.760 --> 00:21:43.520
+is called `libncurses-dev`,
+
+00:21:43.520 --> 00:21:48.259
+where on RedHat it's called `ncurses-devel`.
+
+00:21:48.260 --> 00:21:49.640
+There are likely going to be
+
+00:21:49.640 --> 00:21:52.120
+many more little differences like this
+
+00:21:52.120 --> 00:21:55.339
+that we'll need to solve with properties.
+
+00:21:55.340 --> 00:21:58.609
+Now I already don't like where this is going.
+
+00:21:58.610 --> 00:22:00.880
+Switching between the Debian and RedHat
+
+00:22:00.880 --> 00:22:03.160
+versions of the document is gonna mean
+
+00:22:03.160 --> 00:22:05.200
+commenting and uncommenting out
+
+00:22:05.200 --> 00:22:06.989
+a bunch of different properties,
+
+00:22:06.990 --> 00:22:09.019
+which is pretty janky.
+
+NOTE Using a prefix
+
+00:22:09.020 --> 00:22:11.079
+Luckily we can solve this problem
+
+00:22:11.080 --> 00:22:14.439
+with a little bit of Emacs Lisp.
+
+00:22:14.440 --> 00:22:16.879
+We'll start by modifying our properties,
+
+00:22:16.880 --> 00:22:19.140
+so their property names are prefixed
+
+00:22:19.141 --> 00:22:23.119
+with either `deb_` or `rh_`
+
+00:22:23.120 --> 00:22:27.719
+to signify which distro the property applies to.`
+
+00:22:27.720 --> 00:22:31.160
+We'll also create a single property called "prefix",
+
+00:22:31.160 --> 00:22:34.589
+which will be prepended to the property name
+
+00:22:34.590 --> 00:22:36.529
+by the `get_prop` function
+
+00:22:36.530 --> 00:22:39.509
+if the requested property is not found.
+
+00:22:39.510 --> 00:22:42.200
+This way, when we want to switch between
+
+00:22:42.200 --> 00:22:45.349
+the Debian and RedHat versions of the document,
+
+00:22:45.350 --> 00:22:49.029
+we just need to change the prefix property.
+
+00:22:49.030 --> 00:22:51.379
+So now we'll change the Elisp code.
+
+00:22:51.380 --> 00:22:55.209
+So we'll use a let expression with two bound variables.
+
+00:22:55.210 --> 00:22:56.919
+The first one is called ret,
+
+00:22:56.920 --> 00:22:59.160
+which determines if the initial call
+
+00:22:59.160 --> 00:23:01.949
+to `org-property-values` succeeds.
+
+00:23:01.950 --> 00:23:04.039
+The second variable is called prefix,
+
+00:23:04.040 --> 00:23:06.219
+which is the prefix property.
+
+00:23:06.220 --> 00:23:09.120
+If the first call to `org-property-values` succeeds,
+
+00:23:09.120 --> 00:23:11.159
+we return it as normal.
+
+00:23:11.160 --> 00:23:14.249
+If not, we concatenate the property value
+
+00:23:14.250 --> 00:23:15.920
+that was passed into the function
+
+00:23:15.920 --> 00:23:18.969
+onto the prefix and try again.
+
+00:23:18.970 --> 00:23:23.800
+Now when we call the `get_prop` function with "distro"
+
+00:23:23.800 --> 00:23:26.360
+as the prop argument, it won't be found.
+
+00:23:26.360 --> 00:23:29.689
+So the code will slap our prefix tag on the front,
+
+00:23:29.690 --> 00:23:33.249
+making it something like `rh_distro`,
+
+00:23:33.250 --> 00:23:35.329
+and it will be found and returned.
+
+00:23:35.330 --> 00:23:39.999
+Let's see that in action.
+
+00:23:40.000 --> 00:23:42.009
+All right, now we're talking.
+
+NOTE Switching distributions
+
+00:23:42.010 --> 00:23:44.419
+This setup is starting to look pretty good,
+
+00:23:44.420 --> 00:23:46.040
+but there are just a few things
+
+00:23:46.040 --> 00:23:48.659
+that I want to add before we move on.
+
+00:23:48.660 --> 00:23:51.240
+First of all, I think the document should have a subtitle,
+
+00:23:51.240 --> 00:23:53.960
+something that tells you if you're looking at the RedHat
+
+00:23:53.960 --> 00:23:56.160
+or the Debian version of the document.
+
+00:23:56.160 --> 00:23:57.880
+I also think it would be great
+
+00:23:57.880 --> 00:24:00.520
+if the file name of the exported document
+
+00:24:00.520 --> 00:24:04.999
+reflected the distribution as well.
+
+00:24:05.000 --> 00:24:08.040
+I also want to add a quick Debian only section
+
+00:24:08.040 --> 00:24:11.799
+to the document that explains how it got its name.
+
+00:24:11.800 --> 00:24:17.739
+Now let's see what happens when we export the document.
+
+00:24:17.740 --> 00:24:20.439
+This did not work out as we wanted.
+
+00:24:20.440 --> 00:24:23.360
+As you can see, the macro we used in the subtitles
+
+00:24:23.360 --> 00:24:24.959
+didn't expand properly,
+
+00:24:24.960 --> 00:24:28.640
+and as a result, our subtitle didn't render right.
+
+00:24:28.640 --> 00:24:30.640
+Sadly, you can't use macros
+
+00:24:30.640 --> 00:24:32.909
+or inline function calls everywhere.
+
+00:24:32.910 --> 00:24:34.680
+And one place where they don't work
+
+00:24:34.680 --> 00:24:37.189
+is inside of certain export keywords.
+
+00:24:37.190 --> 00:24:43.219
+So we're gonna have to hard code them here.
+
+00:24:43.220 --> 00:24:46.320
+Another mistake that we made is we forgot to update
+
+00:24:46.320 --> 00:24:49.099
+the `#+EXCLUDE_TAGS` export keyword,
+
+00:24:49.100 --> 00:24:51.439
+because with the RedHat version of the document,
+
+00:24:51.440 --> 00:24:54.509
+we want to exclude the Debian tag.
+
+00:24:54.510 --> 00:24:56.400
+Now when we export the document,
+
+00:24:56.400 --> 00:24:57.839
+everything should be correct.
+
+00:24:57.840 --> 00:25:00.619
+The word RedHat should appear in the subtitle,
+
+00:25:00.620 --> 00:25:04.799
+and the Debian fun fact section should not be present.
+
+00:25:04.800 --> 00:25:06.960
+Now we just need to add a section to the README
+
+00:25:06.960 --> 00:25:09.280
+that explains the steps you need to take
+
+00:25:09.280 --> 00:25:11.000
+in order to switch the document
+
+00:25:11.000 --> 00:25:12.759
+from RedHat to Debian.
+
+00:25:12.760 --> 00:25:14.000
+Okay, let's see here.
+
+00:25:14.000 --> 00:25:18.309
+We have to change `#+SUBTITLE`, change the `#+EXCLUDE_TAGS`,
+
+00:25:18.310 --> 00:25:20.429
+change the `#+EXPORT_FILE_NAME`,
+
+00:25:20.430 --> 00:25:23.289
+and change the `prefix` property.
+
+00:25:23.290 --> 00:25:26.289
+This is OK, but it's not great.
+
+00:25:26.290 --> 00:25:29.429
+Emacs Lisp can once again come to our rescue.
+
+00:25:29.430 --> 00:25:32.080
+What we'll do is make an Elisp code block
+
+00:25:32.080 --> 00:25:35.480
+that will invite the user to hit `C-c C-c` on.
+
+00:25:35.480 --> 00:25:39.520
+And the code block will essentially make all these changes
+
+00:25:39.520 --> 00:25:40.919
+in the document for them.
+
+00:25:40.920 --> 00:25:43.280
+This code block, which we'll call `switch_distro`,
+
+00:25:43.280 --> 00:25:45.680
+takes one argument called `os`,
+
+00:25:45.680 --> 00:25:48.689
+which by default is set to "Debian".
+
+00:25:48.690 --> 00:25:50.760
+It starts out with a let expression
+
+00:25:50.760 --> 00:25:53.029
+that defines three bound variables.
+
+00:25:53.030 --> 00:25:55.969
+The `debian` variable is a boolean that is true
+
+00:25:55.970 --> 00:25:58.699
+if the distro we're switching to is Debian.
+
+00:25:58.700 --> 00:26:00.360
+Based on the value of this boolean,
+
+00:26:00.360 --> 00:26:04.169
+we'll set the `noexport` and `prefix` variables accordingly.
+
+00:26:04.170 --> 00:26:06.720
+The `save-excursion` block tells Emacs
+
+00:26:06.720 --> 00:26:09.199
+that we're going to be moving around in the document
+
+00:26:09.200 --> 00:26:11.680
+and to remember to put our point back where we started
+
+00:26:11.680 --> 00:26:13.429
+when the block finishes.
+
+00:26:13.430 --> 00:26:16.249
+After that, we essentially go to the top of the document
+
+00:26:16.250 --> 00:26:19.839
+and search and replace the subtitle, `exclude_tags`,
+
+00:26:19.840 --> 00:26:22.499
+`export_file_name`, and the `prefix`.
+
+00:26:22.500 --> 00:26:23.389
+Pretty cool.
+
+00:26:23.390 --> 00:26:25.029
+Let's see this in action.
+
+00:26:25.030 --> 00:26:27.869
+If we hit `C-c C-c` on this block,
+
+00:26:27.870 --> 00:26:30.480
+we should see the document automatically change a bit.
+
+00:26:30.480 --> 00:26:32.320
+And now when we export it,
+
+00:26:32.320 --> 00:26:36.089
+we get the Debian version of the doc.
+
+00:26:36.090 --> 00:26:37.629
+If we want to change it back,
+
+00:26:37.630 --> 00:26:39.880
+we can just head back over to the code block
+
+00:26:39.880 --> 00:26:43.149
+and change the default value for the os variable
+
+00:26:43.150 --> 00:26:47.619
+from "Debian" to "RedHat" and hit `C-c C-c` again.
+
+00:26:47.620 --> 00:26:49.919
+And now when we re-export,
+
+00:26:49.920 --> 00:26:52.909
+we're looking at the RedHat version of the document.
+
+00:26:52.910 --> 00:26:55.859
+Just as an aside, if you ever thought to yourself,
+
+00:26:55.860 --> 00:26:58.159
+"I should learn Emacs Lisp someday"
+
+00:26:58.160 --> 00:27:01.289
+Make it someday soon. You'll be happy you did.
+
+00:27:01.290 --> 00:27:03.769
+Not only is it a fun programming language,
+
+00:27:03.770 --> 00:27:06.679
+but you can do powerful things with it in Emacs,
+
+00:27:06.680 --> 00:27:12.149
+which I hope is a point that folks take away from this talk.
+
+00:27:12.150 --> 00:27:14.149
+All right, that was a lot.
+
+NOTE A tour
+
+00:27:14.150 --> 00:27:16.840
+Now that we've spent the past 20 minutes or so
+
+00:27:16.840 --> 00:27:19.409
+digging into some of the tips and tricks I used
+
+00:27:19.410 --> 00:27:22.879
+when creating my build Emacs from source document,
+
+00:27:22.880 --> 00:27:26.279
+we'll say goodbye to this document we've been working on
+
+00:27:26.280 --> 00:27:27.480
+and we'll start a tour
+
+00:27:27.480 --> 00:27:29.960
+of the actual literate document I wrote.
+
+00:27:29.960 --> 00:27:33.080
+A document that I'll demonstrate actually downloading
+
+00:27:33.080 --> 00:27:35.659
+and building a new Emacs when I export it
+
+00:27:35.660 --> 00:27:38.959
+on both my Ubuntu and RedHat virtual machines.
+
+00:27:38.960 --> 00:27:41.689
+I'll also show you how org-mode can generate
+
+00:27:41.690 --> 00:27:44.519
+slick professional looking PDF files
+
+00:27:44.520 --> 00:27:46.579
+through the power of LaTeX.
+
+00:27:46.580 --> 00:27:49.619
+We'll start here at the orgdemo2 directory,
+
+00:27:49.620 --> 00:27:51.229
+which I've cloned from GitLab.
+
+00:27:51.230 --> 00:27:55.599
+This repository has all the source materials for this talk.
+
+00:27:55.600 --> 00:27:59.040
+The buildemacs.org file is where most of the good stuff is.
+
+00:27:59.040 --> 00:28:01.479
+So that's where we'll start.
+
+00:28:01.480 --> 00:28:03.360
+There's a lot of file-local variables
+
+00:28:03.360 --> 00:28:04.800
+that we'll need to confirm.
+
+00:28:04.800 --> 00:28:06.439
+So we'll do that too.
+
+00:28:06.440 --> 00:28:07.560
+So the first thing we're gonna do
+
+00:28:07.560 --> 00:28:10.080
+is hit `C-u TAB` twice,
+
+00:28:10.780 --> 00:28:13.360
+which will give us a top-level overview
+
+00:28:13.360 --> 00:28:15.139
+of all of our headings.
+
+00:28:15.140 --> 00:28:16.600
+As you can see, we've got a lot
+
+00:28:16.600 --> 00:28:20.119
+of the same familiar export keywords we had before.
+
+00:28:20.120 --> 00:28:23.099
+`#+TITLE`, `#+SUBTITLE`, `#+AUTHOR`, `#+EMAIL`,
+
+00:28:23.100 --> 00:28:25.359
+plus a few we haven't seen before.
+
+00:28:25.360 --> 00:28:27.720
+For example, I've squirreled away
+
+00:28:27.720 --> 00:28:30.619
+a lot of the `#+LATEX_HEADER` export keywords
+
+00:28:30.620 --> 00:28:33.539
+in this file called latex.setup.
+
+00:28:33.540 --> 00:28:36.539
+And I did this just so they don't clutter up the document.
+
+00:28:36.540 --> 00:28:38.320
+Much of the LaTeX magic
+
+00:28:38.320 --> 00:28:40.909
+that makes the exported document look good
+
+00:28:40.910 --> 00:28:42.589
+is in these headers.
+
+00:28:42.590 --> 00:28:45.119
+LaTeX commands begin with a backslash.
+
+00:28:45.120 --> 00:28:49.679
+And a common one we use a lot here is `\usepackage`.
+
+00:28:49.680 --> 00:28:52.200
+This lets us bring in packages like geometry,
+
+00:28:52.200 --> 00:28:56.539
+svg for the cool SeaGL SVG logo,
+
+00:28:56.540 --> 00:28:58.440
+`fancyhdr` and fancy verbatim [`fancyvrb`]
+
+00:28:58.440 --> 00:29:00.689
+to keep things looking pretty fancy.
+
+00:29:00.690 --> 00:29:03.200
+Using a scalable vector image format
+
+00:29:03.200 --> 00:29:05.720
+makes it possible for us to do really cool things
+
+00:29:05.720 --> 00:29:09.269
+like having a scaled-down version of the SeaGL logo
+
+00:29:09.270 --> 00:29:11.979
+appear in the fancy footer below.
+
+00:29:11.980 --> 00:29:15.360
+I also include some macros in a separate file
+
+00:29:15.360 --> 00:29:18.120
+just to help keep things tidy in the main document.
+
+00:29:18.120 --> 00:29:20.600
+Here I've got the familiar macros
+
+00:29:20.600 --> 00:29:23.399
+we've seen before for `get_prop`.
+
+00:29:23.400 --> 00:29:25.520
+But here I use different permutations
+
+00:29:25.520 --> 00:29:28.160
+depending on if I want results raw
+
+00:29:28.160 --> 00:29:31.869
+or raw verbatim or just verbatim.
+
+00:29:31.870 --> 00:29:35.069
+I also have a couple of macros here at the top of the file
+
+00:29:35.070 --> 00:29:40.280
+that are for pulling strings out of results blocks
+
+00:29:40.280 --> 00:29:41.920
+and then trimming them
+
+00:29:41.920 --> 00:29:44.719
+so there's no white space on either side.
+
+00:29:44.720 --> 00:29:46.440
+Like in the version of the document
+
+00:29:46.440 --> 00:29:48.429
+we worked on at the start of this talk,
+
+00:29:48.430 --> 00:29:51.079
+the real document also has a README section
+
+00:29:51.080 --> 00:29:53.469
+marked with the `:noexport:` tag.
+
+00:29:53.470 --> 00:29:55.400
+It also has a section about choosing
+
+00:29:55.400 --> 00:29:57.909
+which version of the document to export
+
+00:29:57.910 --> 00:30:00.599
+and a code block on how to switch between them.
+
+00:30:00.600 --> 00:30:03.000
+It's also got a lot of helpful information in it
+
+00:30:03.000 --> 00:30:05.819
+like what OS and Emacs versions
+
+00:30:05.820 --> 00:30:09.559
+the document has been tested to "run" on,
+
+00:30:09.560 --> 00:30:12.329
+a section on the LaTeX prerequisites
+
+00:30:12.330 --> 00:30:14.080
+and the section on executing
+
+00:30:14.080 --> 00:30:16.199
+the document's various code blocks.
+
+NOTE TeX and LaTeX
+
+00:30:16.200 --> 00:30:19.199
+The latter two sections we'll take a look at now.
+
+00:30:19.200 --> 00:30:22.579
+Out of the box on Fedora and Ubuntu server distros,
+
+00:30:22.580 --> 00:30:24.709
+the TeX typesetting system
+
+00:30:24.710 --> 00:30:27.669
+also by noted computer scientist Donald Knuth
+
+00:30:27.670 --> 00:30:28.859
+is not installed.
+
+00:30:28.860 --> 00:30:31.719
+So we'll need to install some packages.
+
+00:30:31.720 --> 00:30:34.449
+Starting out we'll need the `texlive` package
+
+00:30:34.450 --> 00:30:37.459
+which gets you a fully featured TeX setup.
+
+00:30:37.460 --> 00:30:39.289
+This also gets you LaTeX
+
+00:30:39.290 --> 00:30:42.789
+which can be viewed as a distribution of TeX macros.
+
+00:30:42.790 --> 00:30:44.899
+You'll also need XeTeX.
+
+00:30:44.900 --> 00:30:49.779
+This gets you Unicode support and lets you use modern fonts.
+
+00:30:49.780 --> 00:30:52.809
+We'll also want to install pdfTeX.
+
+00:30:52.810 --> 00:30:57.209
+This gets us the ability to generate PDFs from TeX sources.
+
+00:30:57.210 --> 00:31:01.299
+And finally, we're gonna need to install latexmk
+
+00:31:01.300 --> 00:31:02.400
+which is a Perl script
+
+00:31:02.400 --> 00:31:05.139
+that knows how to run LaTeX multiple times
+
+00:31:05.140 --> 00:31:09.249
+in order to properly deal with intra-document links.
+
+NOTE Other prerequisites
+
+00:31:09.250 --> 00:31:11.069
+But wait, there's more.
+
+00:31:11.070 --> 00:31:12.960
+We're also gonna need Inkscape
+
+00:31:12.960 --> 00:31:15.520
+to rasterize our SeaGL vector logo
+
+00:31:15.520 --> 00:31:17.339
+at different resolutions.
+
+00:31:17.340 --> 00:31:20.360
+And we're gonna need the JetBrains Mono font
+
+00:31:20.360 --> 00:31:23.059
+to make our source code look snazzy.
+
+00:31:23.060 --> 00:31:24.680
+We'll also need the Inter font
+
+00:31:24.680 --> 00:31:28.039
+to make our prose look snazzy as well.
+
+00:31:28.040 --> 00:31:31.299
+I've helpfully added a bash code block in the README
+
+00:31:31.300 --> 00:31:35.739
+that you can hit C-c C-c on to install.
+
+00:31:35.740 --> 00:31:38.520
+This really does lock up Emacs for a few minutes
+
+00:31:38.520 --> 00:31:40.329
+and it's sort of annoying.
+
+00:31:40.330 --> 00:31:43.040
+When we export the document and turn off all caching
+
+00:31:43.040 --> 00:31:45.599
+and it actually builds Emacs for real,
+
+00:31:45.600 --> 00:31:48.769
+Emacs can be locked up for tens of minutes.
+
+00:31:48.770 --> 00:31:50.880
+There's a package called ob-async
+
+00:31:50.880 --> 00:31:54.259
+that I've been meaning to check out that might help here.
+
+00:31:54.260 --> 00:31:55.760
+But since I wanted this document
+
+00:31:55.760 --> 00:31:58.000
+to work on bog-standard Emacs setups,
+
+00:31:58.000 --> 00:32:00.059
+I didn't get around to it.
+
+NOTE Caching
+
+00:32:00.060 --> 00:32:03.139
+Before we get into talking about running the document,
+
+00:32:03.140 --> 00:32:06.449
+let's talk briefly about results caching.
+
+00:32:06.450 --> 00:32:08.839
+We'll take a look at the section of the document
+
+00:32:08.840 --> 00:32:13.139
+where we talk about Git tags for an example.
+
+00:32:13.140 --> 00:32:15.760
+The `num_tags` bash code block determines
+
+00:32:15.760 --> 00:32:19.039
+how many tags there are in the Emacs Git repo.
+
+00:32:19.040 --> 00:32:21.600
+And when I hit C-c C-c on that block
+
+00:32:21.600 --> 00:32:25.059
+several days ago, when I was first creating the document,
+
+00:32:25.060 --> 00:32:28.019
+that number was 183.
+
+00:32:28.020 --> 00:32:32.169
+That result has remained cached in the document since then.
+
+00:32:32.170 --> 00:32:34.899
+And you can see a snippet of the SHA1 hash
+
+00:32:34.900 --> 00:32:38.389
+of the contents of the source block below.
+
+00:32:38.390 --> 00:32:40.800
+You can see where I referenced the result
+
+00:32:40.800 --> 00:32:44.960
+using the `sr` for string raw macro in the prose below,
+
+00:32:44.960 --> 00:32:50.509
+and how it gets rendered in the exported PDF document.
+
+00:32:50.510 --> 00:32:52.880
+All the source blocks in the exported sections
+
+00:32:52.880 --> 00:32:56.559
+of the document include cached results like this.
+
+00:32:56.560 --> 00:33:01.389
+If I export the document now, it won't take that long to do
+
+00:33:01.390 --> 00:33:03.800
+because while there are a ton of code blocks
+
+00:33:03.800 --> 00:33:09.069
+in the exported sections, they're all cached.
+
+00:33:09.070 --> 00:33:11.560
+Now let's get back to the section of the README
+
+00:33:11.560 --> 00:33:14.909
+that explains how to execute the code in the document.
+
+00:33:14.910 --> 00:33:17.640
+Here I explain that if you want to build Emacs
+
+00:33:17.640 --> 00:33:20.189
+on your computer using this document,
+
+00:33:20.190 --> 00:33:22.019
+you've got a couple of options.
+
+00:33:22.020 --> 00:33:25.649
+The first option is to manually invalidate the caches
+
+00:33:25.650 --> 00:33:28.960
+and take C-c C-c on every code block
+
+00:33:28.960 --> 00:33:30.959
+in the main document.
+
+00:33:30.960 --> 00:33:33.160
+This lets you supervise the entire process,
+
+00:33:33.160 --> 00:33:36.939
+and it also creates new cached result blocks,
+
+00:33:36.940 --> 00:33:39.239
+but it's time consuming.
+
+00:33:39.240 --> 00:33:43.440
+There is also an internal link to the main document here,
+
+00:33:43.440 --> 00:33:47.379
+and you can jump to it with C-c C-o.
+
+00:33:47.380 --> 00:33:50.040
+This is one of those intra-document links
+
+00:33:50.040 --> 00:33:52.999
+that is really tricky to get right with LaTeX,
+
+00:33:53.000 --> 00:33:56.989
+and is why we opted to use the latexmk Perl script
+
+00:33:56.990 --> 00:34:00.049
+to build the PDF version of the document.
+
+00:34:00.050 --> 00:34:01.920
+I'm mentioning it specifically here
+
+00:34:01.920 --> 00:34:05.629
+because it took me forever to figure this out.
+
+00:34:05.630 --> 00:34:07.269
+The second option you've got
+
+00:34:07.270 --> 00:34:09.280
+is to change the default header arg
+
+00:34:09.280 --> 00:34:13.739
+from `:cache yes` to `:cache no` at the top of the document.
+
+00:34:13.740 --> 00:34:16.269
+If we cruise up to the top of the document,
+
+00:34:16.270 --> 00:34:19.129
+you can see that this header argument property
+
+00:34:19.130 --> 00:34:22.440
+basically says that unless a code block
+
+00:34:22.440 --> 00:34:24.160
+explicitly says otherwise,
+
+00:34:24.160 --> 00:34:27.118
+it's by default supposed to be cached.
+
+00:34:27.119 --> 00:34:29.440
+That's how we were able to export the document
+
+00:34:29.440 --> 00:34:31.558
+before so quickly.
+
+00:34:31.559 --> 00:34:34.819
+The code block named `no_cache_no_confirm`
+
+00:34:34.820 --> 00:34:38.618
+uses the `save-excursion` and regex replace trick
+
+00:34:38.619 --> 00:34:40.348
+that I demonstrated earlier
+
+00:34:40.349 --> 00:34:42.819
+to munch the default cache header arg
+
+00:34:42.820 --> 00:34:45.409
+from "cache yes" to "cache no".
+
+00:34:45.410 --> 00:34:49.299
+And it also turns off confirmations on bash code blocks.
+
+00:34:49.300 --> 00:34:51.939
+Let's do that now.
+
+00:34:51.940 --> 00:34:54.559
+Now we'll export the document to PDF,
+
+00:34:54.560 --> 00:34:57.439
+which will ignore the cache result blocks
+
+00:34:57.440 --> 00:35:00.319
+and clone the Git repository on Savannah,
+
+00:35:00.320 --> 00:35:01.760
+create a branch that points
+
+00:35:01.760 --> 00:35:05.459
+to the most recently tagged version of Emacs 29,
+
+00:35:05.460 --> 00:35:07.759
+run configure a handful of times,
+
+00:35:07.760 --> 00:35:10.720
+installing packages to fix missing dependencies
+
+00:35:10.720 --> 00:35:12.399
+along the way,
+
+00:35:12.400 --> 00:35:16.099
+build Emacs, install Emacs in our home directory,
+
+00:35:16.100 --> 00:35:19.339
+verify that it has successfully built a binary,
+
+00:35:19.340 --> 00:35:22.549
+run it in batch mode with some sample Elisp
+
+00:35:22.550 --> 00:35:26.869
+and show the file sizes and dates of the generated files.
+
+00:35:26.870 --> 00:35:28.339
+This is gonna take a while.
+
+00:35:28.340 --> 00:35:32.829
+And while it's running, we'll pop over to our Fedora box.
+
+00:35:32.830 --> 00:35:34.680
+All right, now we'll fire up Emacs,
+
+00:35:34.680 --> 00:35:39.280
+hit `C-c C-c` on the `configure_document` code block
+
+00:35:39.280 --> 00:35:41.849
+to configure the document for RedHat
+
+00:35:41.850 --> 00:35:45.709
+since Fedora here is a RedHat based distro.
+
+00:35:45.710 --> 00:35:47.040
+Then what we'll do is we'll pop down
+
+00:35:47.040 --> 00:35:49.589
+and hit `C-c C-c`
+
+00:35:49.590 --> 00:35:53.699
+on the `rh_install_latex` code block
+
+00:35:53.700 --> 00:35:56.229
+to install the LaTeX prerequisites
+
+00:35:56.230 --> 00:35:58.459
+for this Fedora virtual machine.
+
+00:35:58.460 --> 00:36:02.589
+Finally, we'll execute the `no_cache_no_confirm` block
+
+00:36:02.590 --> 00:36:05.049
+and then kick off the export.
+
+00:36:05.050 --> 00:36:07.280
+Then we'll go and check back on what's happening
+
+00:36:07.280 --> 00:36:09.529
+on the Ubuntu box.
+
+00:36:09.530 --> 00:36:11.240
+Ooh, top looks pretty quiet.
+
+00:36:11.240 --> 00:36:14.039
+I think the export is complete.
+
+00:36:14.040 --> 00:36:17.559
+Ooh, those are the words I love to see in the status area,
+
+00:36:17.560 --> 00:36:20.609
+PDF file produced!
+
+NOTE Looking at the PDF
+
+00:36:20.610 --> 00:36:22.600
+Now I can't use my web browser
+
+00:36:22.600 --> 00:36:24.959
+to take a look at this PDF file
+
+00:36:24.960 --> 00:36:27.080
+because I haven't set up a web server
+
+00:36:27.080 --> 00:36:30.759
+or anything like that on the Ubuntu virtual machine.
+
+00:36:30.760 --> 00:36:34.439
+I can, however, use TRAMP with the ssh method
+
+00:36:34.440 --> 00:36:36.560
+to poke around on the ubuntu host
+
+00:36:36.560 --> 00:36:39.120
+on my personal version of Emacs.
+
+00:36:39.120 --> 00:36:40.939
+So let's do that.
+
+00:36:40.940 --> 00:36:44.809
+Okay, so now if we go into the source directory
+
+00:36:44.810 --> 00:36:48.039
+and then we hop into the orgdemo2 directory
+
+00:36:48.040 --> 00:36:51.619
+and then we look at the deb version of the PDF,
+
+00:36:51.620 --> 00:36:54.149
+there she blows.
+
+00:36:54.150 --> 00:36:58.160
+Now, if we go down to the Building Emacs section,
+
+00:36:58.160 --> 00:37:00.129
+we can see that it built.
+
+00:37:00.130 --> 00:37:03.839
+And if we look in the bin directory,
+
+00:37:03.840 --> 00:37:06.779
+we can see that at 17:01,
+
+00:37:06.780 --> 00:37:11.379
+that's when all of those files got created.
+
+00:37:11.380 --> 00:37:15.589
+Also the file creation date on the PDF is 17:01.
+
+00:37:15.590 --> 00:37:18.720
+So all of this code executed roughly the same time
+
+00:37:18.720 --> 00:37:21.159
+the PDF was created.
+
+00:37:21.160 --> 00:37:25.339
+All right, so now let's head back over to the Fedora box
+
+00:37:25.340 --> 00:37:27.920
+and then we'll navigate to the source directory,
+
+00:37:27.920 --> 00:37:30.119
+the orgdemo2 directory,
+
+00:37:30.120 --> 00:37:35.719
+and there is our RedHat version of the built Emacs PDF.
+
+00:37:35.720 --> 00:37:38.219
+And Bob's your uncle.
+
+00:37:38.220 --> 00:37:42.549
+And you can see it is the RedHat version of the document
+
+00:37:42.550 --> 00:37:44.939
+because this is a RedHat box.
+
+00:37:44.940 --> 00:37:51.639
+And if we go over to the What did we install? section,
+
+00:37:51.640 --> 00:37:56.049
+you can see that these binaries were built at 17:35.
+
+00:37:56.050 --> 00:37:58.699
+And now if we pop open dired
+
+00:37:58.700 --> 00:38:00.739
+and we take a look at the PDF,
+
+00:38:00.740 --> 00:38:07.329
+we can see it also was created at 17:35.
+
+00:38:07.330 --> 00:38:10.039
+All right, in the couple minutes remaining,
+
+00:38:10.040 --> 00:38:11.640
+I thought it would be a good idea
+
+00:38:11.640 --> 00:38:15.739
+just to take a look at the document
+
+00:38:15.740 --> 00:38:19.000
+and maybe just go through some of what it actually does
+
+00:38:19.000 --> 00:38:22.579
+in explaining how to build Emacs from source.
+
+00:38:22.580 --> 00:38:27.139
+We'll look at the RedHat version since we're here.
+
+00:38:27.140 --> 00:38:28.160
+And the first thing you do is
+
+00:38:28.160 --> 00:38:31.539
+you have to get access to the source code.
+
+00:38:31.540 --> 00:38:32.840
+And before you can do anything,
+
+00:38:32.840 --> 00:38:35.419
+this is a RedHat-specific section
+
+00:38:35.420 --> 00:38:38.299
+where you need to install some development tools.
+
+00:38:38.300 --> 00:38:41.539
+And this development tools group actually has Git.
+
+00:38:41.540 --> 00:38:44.640
+Now I installed Git earlier, but if you didn't do that,
+
+00:38:44.640 --> 00:38:46.939
+that would be the first thing that you need to do.
+
+00:38:46.940 --> 00:38:50.039
+We create a source directory, we cd into it,
+
+00:38:50.040 --> 00:38:53.059
+we clone the repo from Savannah.
+
+00:38:53.060 --> 00:38:56.059
+And then we start to take a look at some of the Git tags.
+
+00:38:56.060 --> 00:38:58.560
+And we showed this before where we check out
+
+00:38:58.560 --> 00:39:00.369
+how many different tags there are.
+
+00:39:00.370 --> 00:39:02.400
+And then we run this kind of funky Git command
+
+00:39:02.400 --> 00:39:06.040
+to sort of list all the tags that begin with 'emacs-29',
+
+00:39:06.040 --> 00:39:08.759
+and we sort them by when they were tagged.
+
+00:39:08.760 --> 00:39:12.400
+So we can see that Emacs 29.1.pretest
+
+00:39:12.400 --> 00:39:14.439
+is the most recent version.
+
+00:39:14.440 --> 00:39:15.880
+So that's the one we grab
+
+00:39:15.880 --> 00:39:18.659
+and that's the one we decide to build.
+
+00:39:18.660 --> 00:39:22.779
+And then we create a branch that is based on this tag.
+
+00:39:22.780 --> 00:39:27.479
+And this is dynamically generated based on what we saw here.
+
+00:39:27.480 --> 00:39:29.439
+So that's what we use here.
+
+NOTE Errors
+
+00:39:29.440 --> 00:39:32.920
+In this case, we're piping standard error
+
+00:39:32.920 --> 00:39:35.099
+to where standard out goes.
+
+00:39:35.100 --> 00:39:36.069
+That's another trick.
+
+00:39:36.070 --> 00:39:39.559
+If you want to actually see an error get created,
+
+00:39:39.560 --> 00:39:44.119
+org-mode will capture any errors that code blocks produce,
+
+00:39:44.120 --> 00:39:46.819
+and it will show you the error message in a buffer.
+
+00:39:46.820 --> 00:39:49.240
+So if you actually wanna show what it looks like
+
+00:39:49.240 --> 00:39:53.059
+when something errors out, this is the trick you have to use.
+
+00:39:53.060 --> 00:39:56.200
+And then what we do is we look for a configure script
+
+00:39:56.200 --> 00:39:57.419
+and there isn't one.
+
+00:39:57.420 --> 00:39:58.599
+And then we realize,
+
+00:39:58.600 --> 00:40:00.909
+uh-oh, we're gonna have to deal with autotools.
+
+00:40:00.910 --> 00:40:05.560
+So, you know, we run the autogen script and it complains
+
+00:40:05.560 --> 00:40:08.679
+because we're missing some prerequisites.
+
+00:40:08.680 --> 00:40:11.349
+So we have to install autoconf,
+
+00:40:11.350 --> 00:40:13.019
+and then we run it again,
+
+00:40:13.020 --> 00:40:15.959
+and finally it generates a configure script.
+
+00:40:15.960 --> 00:40:19.019
+And this is another case where I pull this number
+
+00:40:19.020 --> 00:40:21.979
+right here into the actual prose.
+
+00:40:21.980 --> 00:40:24.840
+And I can see it's, oh, it's, you know, this how many bytes.
+
+00:40:24.840 --> 00:40:26.800
+When was the last time you wrote a shell script
+
+00:40:26.800 --> 00:40:29.579
+that was this many bytes long?
+
+00:40:29.580 --> 00:40:31.320
+And then we configure the build process.
+
+00:40:31.320 --> 00:40:33.760
+And, you know, it's not gonna work right away
+
+00:40:33.760 --> 00:40:36.699
+because we don't have GNU Texinfo installed.
+
+00:40:36.700 --> 00:40:41.439
+So we gotta do that, which we do with `dnf install` here.
+
+00:40:41.440 --> 00:40:44.320
+And then there's this section that is either RedHat-
+
+00:40:44.320 --> 00:40:48.919
+or Debian-specific that talks about, like,
+
+00:40:48.920 --> 00:40:51.240
+if you don't know the name of a package
+
+00:40:51.240 --> 00:40:55.160
+that contains a given file name, how do you query it?
+
+00:40:55.160 --> 00:40:59.519
+And in the RedHat world, you use `dnf provides makeinfo`.
+
+00:40:59.520 --> 00:41:02.289
+In the Debian world, you do something entirely different.
+
+00:41:02.290 --> 00:41:06.639
+And then we have to install the `ncurses` binary.
+
+00:41:06.640 --> 00:41:10.299
+And finally we get like a minimal configuration
+
+00:41:10.300 --> 00:41:13.699
+and you can see that there's a whole bunch of nos here.
+
+00:41:13.700 --> 00:41:15.200
+So, you know, we don't have cairo,
+
+00:41:15.200 --> 00:41:18.799
+we don't have imagemagick, we don't have dbus,
+
+00:41:18.800 --> 00:41:20.600
+you know, there's a whole bunch of stuff we don't have.
+
+00:41:20.600 --> 00:41:23.880
+We don't have X, we don't have libjansson, no tree-sitter.
+
+00:41:23.880 --> 00:41:25.960
+This is really a bare-bones Emacs
+
+00:41:25.960 --> 00:41:28.639
+that is strictly terminal mode.
+
+00:41:28.640 --> 00:41:30.800
+Then we actually build Emacs, which is, you know,
+
+00:41:30.800 --> 00:41:33.259
+kind of boring, we're just gonna type make
+
+00:41:33.260 --> 00:41:35.259
+and then make is gonna run successfully.
+
+00:41:35.260 --> 00:41:37.880
+And make is gonna spew a ton of output, right?
+
+00:41:37.880 --> 00:41:41.099
+So here's where I do that /dev/null trick,
+
+00:41:41.100 --> 00:41:42.600
+where I pipe everything to /dev/null
+
+00:41:42.600 --> 00:41:45.819
+and then I, or I pipe standard output to /dev/null
+
+00:41:45.820 --> 00:41:47.520
+and then I pipe standard error
+
+00:41:47.520 --> 00:41:50.239
+to wherever standard output's going.
+
+00:41:50.240 --> 00:41:52.799
+And then at the end to say that it ran successfully,
+
+00:41:52.800 --> 00:41:55.379
+I say "Make ran successfully!"
+
+00:41:55.380 --> 00:41:57.799
+Then we take a look at the Emacs binary
+
+00:41:57.800 --> 00:41:59.879
+and you know, it's an elf binary.
+
+00:41:59.880 --> 00:42:01.720
+And, you know, because this is running on my Mac,
+
+00:42:01.720 --> 00:42:06.619
+this is an ARM-based machine, this virtual machine is.
+
+00:42:06.620 --> 00:42:10.519
+Oops, and this is a bug.
+
+00:42:10.520 --> 00:42:12.200
+This really should be a macro call,
+
+00:42:12.200 --> 00:42:14.800
+but I think I have the wrong number of curly braces
+
+00:42:14.800 --> 00:42:16.159
+or something in there.
+
+00:42:16.160 --> 00:42:19.129
+I need to figure out why that's not right.
+
+00:42:19.130 --> 00:42:21.109
+I'll look into that later.
+
+00:42:21.110 --> 00:42:23.979
+And then we install Emacs and then we kind of show
+
+00:42:23.980 --> 00:42:27.719
+like the file sizes of everything in the home directory.
+
+00:42:27.720 --> 00:42:31.989
+And then we, you know, show the binaries that got installed.
+
+NOTE Final thoughts
+
+00:42:31.990 --> 00:42:35.599
+Anyway, so this is the final thoughts section.
+
+00:42:35.600 --> 00:42:39.219
+And my final thoughts are, is I hope you enjoyed this talk
+
+00:42:39.220 --> 00:42:42.379
+and I hope you actually learned a thing or two.
+
+00:42:42.380 --> 00:42:43.360
+All right, thanks everybody.
+
+00:42:43.360 --> 00:42:45.200
+And I'll see you all next time.
diff --git a/2023/captions/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main--chapters.vtt b/2023/captions/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main--chapters.vtt
new file mode 100644
index 00000000..a61c9cd3
--- /dev/null
+++ b/2023/captions/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main--chapters.vtt
@@ -0,0 +1,20 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:02:06.040
+Introduction
+
+00:02:06.040 --> 00:03:14.919
+Tip about completion frameworks
+
+00:03:14.920 --> 00:05:39.320
+References file overview
+
+00:05:39.320 --> 00:08:02.719
+The Emacs Lisp code
+
+00:08:02.720 --> 00:11:41.539
+Example reference to Elfeed article
+
+00:11:41.540 --> 00:15:04.320
+Searching the references
diff --git a/2023/captions/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main.vtt b/2023/captions/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main.vtt
new file mode 100644
index 00000000..f678c7ed
--- /dev/null
+++ b/2023/captions/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main.vtt
@@ -0,0 +1,808 @@
+WEBVTT captioned by bhavin192, checked by sachac
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:04.940
+Hello, this is Christopher Howard,
+
+00:00:04.940 --> 00:00:06.520
+and welcome to my talk,
+
+00:00:06.520 --> 00:00:08.800
+"Informal Reference Tracking."
+
+00:00:08.800 --> 00:00:10.574
+This is a workflow talk,
+
+00:00:10.574 --> 00:00:12.240
+so I need to explain a little bit about
+
+00:00:12.240 --> 00:00:14.840
+what my needs were.
+
+00:00:14.840 --> 00:00:18.760
+I am not a professional scholar or academic,
+
+00:00:18.760 --> 00:00:20.200
+but there are a number of subjects
+
+00:00:20.200 --> 00:00:21.607
+that I'm interested in,
+
+00:00:21.607 --> 00:00:23.240
+and I occasionally like to write
+
+00:00:23.240 --> 00:00:25.600
+gemlog posts about them.
+
+00:00:25.600 --> 00:00:28.680
+So I needed some way to keep track of references.
+
+00:00:28.680 --> 00:00:32.960
+References to webpage articles, references to books,
+
+00:00:32.960 --> 00:00:37.280
+pages in books, and notes about them.
+
+00:00:37.280 --> 00:00:39.480
+Something that was searchable,
+
+00:00:39.480 --> 00:00:42.440
+but also something that was quick and easy to use,
+
+00:00:42.440 --> 00:00:45.200
+and something that I could set up quickly.
+
+00:00:45.200 --> 00:00:47.360
+And the approach I took, it only took me
+
+00:00:47.360 --> 00:00:49.520
+about an hour or two to figure out
+
+00:00:49.520 --> 00:00:52.160
+how to put it together.
+
+00:00:52.160 --> 00:00:53.840
+I do want to emphasize
+
+00:00:53.840 --> 00:00:56.520
+that there are better ways to do this.
+
+00:00:56.520 --> 00:00:58.960
+I'm not recommending you use my code
+
+00:00:58.960 --> 00:01:02.120
+or follow my exact approach.
+
+00:01:02.120 --> 00:01:05.940
+In particular, what I'm doing was meant to be done
+
+00:01:05.940 --> 00:01:09.240
+with Org's built-in capture
+
+00:01:09.240 --> 00:01:11.800
+and templates functionality,
+
+00:01:11.800 --> 00:01:14.907
+so that's something that's more flexible,
+
+00:01:14.907 --> 00:01:21.440
+programmable, and there's also a lot of add-ins
+
+00:01:21.440 --> 00:01:23.960
+that can be tied into that.
+
+00:01:23.960 --> 00:01:31.320
+For example, tools that allow you to search for,
+
+00:01:31.320 --> 00:01:34.480
+you know, feed in a URL, and it automatically
+
+00:01:34.480 --> 00:01:38.240
+pulls all the reference data for you.
+
+00:01:38.240 --> 00:01:39.760
+And there's tools out there
+
+00:01:39.760 --> 00:01:43.120
+that are really meant for scientific writing,
+
+00:01:43.120 --> 00:01:46.760
+so if you do this professionally,
+
+00:01:46.760 --> 00:01:49.960
+you may need to keep track of dozens of details
+
+00:01:49.960 --> 00:01:51.080
+for each reference
+
+00:01:51.080 --> 00:01:55.320
+and then have some fancy system to generate that
+
+00:01:55.320 --> 00:02:00.800
+into your, or output that into your paper.
+
+00:02:00.800 --> 00:02:02.440
+So there are better systems,
+
+00:02:02.440 --> 00:02:06.040
+but this is what worked for me and what was easy.
+
+NOTE Tip about completion frameworks
+
+00:02:06.040 --> 00:02:11.320
+I do want to emphasize that if you haven't,
+
+00:02:11.320 --> 00:02:14.640
+you really want to learn how to use helm-mode
+
+00:02:14.640 --> 00:02:20.440
+H-E-L-M, or one of the similar systems in Emacs
+
+00:02:20.440 --> 00:02:26.440
+that does fuzzy search on Emacs commands.
+
+00:02:26.440 --> 00:02:29.340
+For example, in Helm here,
+
+00:02:29.340 --> 00:02:39.007
+I input one keychord, and then I just have to remember
+
+00:02:39.007 --> 00:02:40.720
+a few characters of some command,
+
+00:02:40.720 --> 00:02:43.479
+and they don't even have to be right next to each other,
+
+00:02:43.480 --> 00:02:47.640
+like H-O-C will bring up `helm-occur`.
+
+00:02:47.640 --> 00:02:51.360
+That's based on its algorithms
+
+00:02:51.360 --> 00:02:53.000
+of what I most likely meant
+
+00:02:53.000 --> 00:02:55.160
+and the ones that I've used in the past.
+
+00:02:55.160 --> 00:02:57.920
+So it usually brings up the command that I want,
+
+00:02:57.920 --> 00:02:59.579
+or the one that I want
+
+00:02:59.580 --> 00:03:03.080
+is one or two spots away in the entry.
+
+00:03:03.080 --> 00:03:05.074
+That just saves me a lot of time
+
+00:03:05.074 --> 00:03:06.960
+[and] a lot of memorization.
+
+00:03:06.960 --> 00:03:09.120
+So if you haven't learned Helm
+
+00:03:09.120 --> 00:03:14.919
+or a similar system for Emacs, you really want to.
+
+NOTE References file overview
+
+00:03:14.920 --> 00:03:18.240
+So what is my approach?
+
+00:03:18.240 --> 00:03:24.880
+Well, basically, what it comes down to is really
+
+00:03:24.880 --> 00:03:27.307
+fundamentally nothing more than just a list
+
+00:03:27.307 --> 00:03:30.640
+of Org entries in a file.
+
+00:03:30.640 --> 00:03:35.579
+And there's one entry per reference.
+
+00:03:35.580 --> 00:03:37.207
+Fundamentally, that's all it is.
+
+00:03:37.207 --> 00:03:39.207
+But I'll go over the parts.
+
+00:03:39.207 --> 00:03:43.080
+You can see there's the title for the entry,
+
+00:03:43.080 --> 00:03:44.800
+and that's not necessarily
+
+00:03:44.800 --> 00:03:47.400
+the title of the book or the article,
+
+00:03:47.400 --> 00:03:50.840
+but that's my perspective on it,
+
+00:03:50.840 --> 00:03:52.720
+that's what I want to remember about it,
+
+00:03:52.720 --> 00:03:54.560
+and what I'll be looking for later
+
+00:03:54.560 --> 00:03:56.560
+when I do a search on my references.
+
+00:03:56.560 --> 00:04:06.659
+There's also in here the use of Org's tags
+
+00:04:06.660 --> 00:04:08.274
+here to the right of the title,
+
+00:04:08.274 --> 00:04:12.040
+very handy for searching for entries later.
+
+00:04:12.040 --> 00:04:18.160
+I use some Org properties attached to each entry.
+
+00:04:18.160 --> 00:04:21.740
+I automatically add in here an ID
+
+00:04:21.740 --> 00:04:24.074
+that can be useful if you want to
+
+00:04:24.074 --> 00:04:27.800
+link entries together later.
+
+00:04:27.800 --> 00:04:30.400
+I automatically add in here the date
+
+00:04:30.400 --> 00:04:31.840
+that the entry was created,
+
+00:04:31.840 --> 00:04:35.699
+which can be useful to me if things
+
+00:04:35.700 --> 00:04:38.360
+got sorted in a different order at some point,
+
+00:04:38.360 --> 00:04:39.940
+I could still look through
+
+00:04:39.940 --> 00:04:42.507
+the most recent entries that I had made
+
+00:04:42.507 --> 00:04:45.040
+if I wanted to do that for some reason.
+
+00:04:45.040 --> 00:04:48.640
+And sometimes I add in this publication year field
+
+00:04:48.640 --> 00:04:52.720
+with the idea that one day I might want to do
+
+00:04:52.720 --> 00:04:55.840
+a search for entries based on the publication year
+
+00:04:55.840 --> 00:04:57.360
+of the book or the article,
+
+00:04:57.360 --> 00:05:00.774
+say, only to use recent references
+
+00:05:00.774 --> 00:05:03.080
+or something like that.
+
+00:05:03.080 --> 00:05:05.360
+And then down here below the properties
+
+00:05:05.360 --> 00:05:10.080
+is where I paste in the URL to the webpage, or
+
+00:05:10.080 --> 00:05:13.007
+type in the title and author of the book
+
+00:05:13.007 --> 00:05:16.959
+on the pages, maybe the pages that were relevant,
+
+00:05:16.960 --> 00:05:21.640
+the pages of the periodical, or something like that.
+
+00:05:21.640 --> 00:05:23.920
+And I could put anything that I want down here,
+
+00:05:23.920 --> 00:05:25.840
+some other notes about what's important
+
+00:05:25.840 --> 00:05:29.939
+about this article to me.
+
+00:05:29.940 --> 00:05:32.200
+So fundamentally, that's all it is.
+
+00:05:32.200 --> 00:05:35.240
+Of course, I've added in a bit of convenience code
+
+00:05:35.240 --> 00:05:37.080
+to make this go a lot faster
+
+00:05:37.080 --> 00:05:39.320
+rather than typing all this out.
+
+NOTE The Emacs Lisp code
+
+00:05:39.320 --> 00:05:45.879
+For that, I'll switch back to my init.el file.
+
+00:05:45.880 --> 00:05:49.480
+There's really just five functions.
+
+00:05:49.480 --> 00:05:52.840
+The first two here are ones
+
+00:05:52.840 --> 00:05:54.560
+that I've adapted off the Internet.
+
+00:05:54.560 --> 00:05:56.160
+Honestly, I can't remember
+
+00:05:56.160 --> 00:05:58.239
+exactly where that I got them from,
+
+00:05:58.240 --> 00:06:00.240
+but basically, they're just some functions
+
+00:06:00.240 --> 00:06:04.240
+for making a block of text writable or readable.
+
+00:06:04.240 --> 00:06:09.299
+Writable or not writable, I should say.
+
+00:06:09.300 --> 00:06:12.200
+The idea there is that
+
+00:06:12.200 --> 00:06:13.480
+when I'm creating a new entry,
+
+00:06:13.480 --> 00:06:16.307
+I don't want to accidentally delete
+
+00:06:16.307 --> 00:06:18.960
+or write over some earlier entries that I've made.
+
+00:06:18.960 --> 00:06:24.880
+So I use a little bit of Emacs functionality for that.
+
+00:06:24.880 --> 00:06:29.440
+And then here are the three reference functions
+
+00:06:29.440 --> 00:06:32.440
+that I've actually written.
+
+00:06:32.440 --> 00:06:35.040
+Really trivial, basic stuff here.
+
+00:06:35.040 --> 00:06:41.800
+The core of it is the `new-reference` function.
+
+00:06:41.800 --> 00:06:44.840
+Basically, what that does is
+
+00:06:44.840 --> 00:06:47.560
+it opens up the references file,
+
+00:06:47.560 --> 00:06:52.040
+jumps to the end of the reference file,
+
+00:06:52.040 --> 00:06:57.440
+starts a new entry, inserts the asterisk.
+
+00:06:57.440 --> 00:07:01.520
+It jumps back to the previous text,
+
+00:07:01.520 --> 00:07:03.474
+and whatever previous text there is,
+
+00:07:03.474 --> 00:07:04.880
+it makes that read-only.
+
+00:07:04.880 --> 00:07:08.120
+Again, so that I don't accidentally delete that,
+
+00:07:08.120 --> 00:07:10.800
+or cut, or type over it, or something
+
+00:07:10.800 --> 00:07:14.579
+when I'm making a new reference.
+
+00:07:14.580 --> 00:07:17.680
+Then it goes back to the new reference,
+
+00:07:17.680 --> 00:07:21.339
+automatically adds in a unique ID for that,
+
+00:07:21.340 --> 00:07:25.360
+and then automatically stamps it with
+
+00:07:25.360 --> 00:07:28.999
+the date the entry was created — today's date.
+
+00:07:29.000 --> 00:07:32.760
+Now, I've got two other functions here.
+
+00:07:32.760 --> 00:07:34.540
+One is `view-references`,
+
+00:07:34.540 --> 00:07:37.807
+which does nothing but open up the reference file
+
+00:07:37.807 --> 00:07:39.400
+and switch to that buffer
+
+00:07:39.400 --> 00:07:42.539
+if you're not already on it.
+
+00:07:42.540 --> 00:07:45.880
+And then there's one other here, `edit-references`,
+
+00:07:45.880 --> 00:07:50.159
+which does the exact same thing except for
+
+00:07:50.160 --> 00:07:53.560
+it also goes over all the text in the buffer
+
+00:07:53.560 --> 00:07:55.040
+and makes it writable.
+
+00:07:55.040 --> 00:07:58.120
+So if I really do want to edit those other references,
+
+00:07:58.120 --> 00:08:02.719
+I've got a function to quickly make that possible.
+
+NOTE Example reference to Elfeed article
+
+00:08:02.720 --> 00:08:07.499
+Let me give an example of this.
+
+00:08:07.500 --> 00:08:13.979
+I type in here, new reference.
+
+00:08:13.980 --> 00:08:16.440
+Now I've jumped to the end of my references file.
+
+00:08:16.440 --> 00:08:19.080
+See, it's ready to take the title.
+
+00:08:19.080 --> 00:08:21.720
+Well, I guess I need to have something,
+
+00:08:21.720 --> 00:08:23.659
+some content, to put in here.
+
+00:08:23.660 --> 00:08:28.879
+Let's say I was looking through Elfeed,
+
+00:08:28.880 --> 00:08:31.600
+and let's say I found this interesting article
+
+00:08:31.600 --> 00:08:38.219
+about Mars earthquakes.
+
+00:08:38.220 --> 00:08:40.007
+Let's say I open it up [and]
+
+00:08:40.007 --> 00:08:41.159
+I read through the article.
+
+00:08:41.160 --> 00:08:43.840
+First, I'd figure out what it is
+
+00:08:43.840 --> 00:08:47.259
+that I find interesting about this, what it is that
+
+00:08:47.260 --> 00:08:51.579
+I'm going to want to remember and look up later.
+
+00:08:51.580 --> 00:08:57.479
+So I come up with a quick title based on that.
+
+00:08:57.480 --> 00:09:01.899
+Let's go back to the references with `view-reference`.
+
+00:09:01.900 --> 00:09:05.674
+And, let's just call it
+
+00:09:05.674 --> 00:09:13.879
+"Study of Mars Earthquake."
+
+00:09:13.880 --> 00:09:18.199
+Now I'm going to also want to put in some tags.
+
+00:09:18.200 --> 00:09:21.107
+On my system, that's done with
+
+00:09:21.107 --> 00:09:23.639
+Control C, Control Q (`C-c C-q`).
+
+00:09:23.640 --> 00:09:25.520
+And I can put in some tags.
+
+00:09:25.520 --> 00:09:29.160
+I like to go ahead and insert the colons.
+
+00:09:29.160 --> 00:09:30.799
+You can leave those out,
+
+00:09:30.800 --> 00:09:32.560
+but they're going to get added anyway,
+
+00:09:32.560 --> 00:09:36.779
+so I'm in the habit of using them.
+
+00:09:36.780 --> 00:09:41.120
+Let's say we'll call this 'Astronomy' as one tag,
+
+00:09:41.120 --> 00:09:47.059
+and the next tag could be 'Planets'.
+
+00:09:47.060 --> 00:09:48.400
+If I wanted to use a tag
+
+00:09:48.400 --> 00:09:50.400
+that was more than one word in the tag,
+
+00:09:50.400 --> 00:09:53.540
+I'd need to use underscores or something like that.
+
+00:09:53.540 --> 00:10:00.499
+If I wanted a tag that was 'Mars Earthquakes',
+
+00:10:00.500 --> 00:10:05.059
+I could do it like that, but that's kind of silly.
+
+00:10:05.060 --> 00:10:08.659
+Now I try not to be too clever with the tags.
+
+00:10:08.660 --> 00:10:10.600
+I don't spend a lot of time thinking about them.
+
+00:10:10.600 --> 00:10:13.107
+I just come up with some general buckets
+
+00:10:13.107 --> 00:10:15.019
+to throw things in.
+
+00:10:15.020 --> 00:10:16.880
+You can see the tags were added there,
+
+00:10:16.880 --> 00:10:19.379
+to the right of the title.
+
+00:10:19.380 --> 00:10:23.399
+Now you can see down here under PROPERTIES,
+
+00:10:23.400 --> 00:10:25.320
+the ID has already been added,
+
+00:10:25.320 --> 00:10:27.040
+the Date_Created has been added.
+
+00:10:27.040 --> 00:10:30.200
+Sometimes, I'll like to put in the publication year,
+
+00:10:30.200 --> 00:10:38.139
+and for that, I use the `org-set-property` command.
+
+00:10:38.140 --> 00:10:43.439
+Publication_Year, this year in this case.
+
+00:10:43.440 --> 00:10:46.679
+And then I just need to paste in the URL.
+
+00:10:46.680 --> 00:10:48.080
+I do that manually.
+
+00:10:48.080 --> 00:10:53.480
+I use Org's bracket format for that.
+
+00:10:53.480 --> 00:10:57.639
+So I start that, go back to the article,
+
+00:10:57.640 --> 00:11:02.099
+copy the URL, paste that in.
+
+00:11:02.100 --> 00:11:04.480
+If I want, I can add it in the title
+
+00:11:04.480 --> 00:11:07.459
+with the second pair of brackets here.
+
+00:11:07.460 --> 00:11:14.200
+Don't have to, but often like to.
+
+00:11:14.200 --> 00:11:18.560
+Close that off, and there it is.
+
+00:11:18.560 --> 00:11:20.879
+That was really it.
+
+00:11:20.880 --> 00:11:22.120
+I add a return on the end here,
+
+00:11:22.120 --> 00:11:26.619
+just so the next entry comes out with the right spacing.
+
+00:11:26.620 --> 00:11:28.307
+But really, that's it,
+
+00:11:28.307 --> 00:11:31.000
+and typically, when I'm not explaining it,
+
+00:11:31.000 --> 00:11:37.499
+that only takes 20 seconds or so, or 30 seconds.
+
+00:11:37.500 --> 00:11:41.539
+Pretty quick. Pretty easy.
+
+NOTE Searching the references
+
+00:11:41.540 --> 00:11:45.539
+What about searching later?
+
+00:11:45.540 --> 00:11:50.474
+Well, often the easiest thing is just do a simple,
+
+00:11:50.474 --> 00:11:54.639
+boring incremental search.
+
+00:11:54.640 --> 00:11:55.880
+I usually know roughly
+
+00:11:55.880 --> 00:11:58.499
+what it is that I'm looking for already.
+
+00:11:58.500 --> 00:12:02.379
+If I was looking for that wildflower article,
+
+00:12:02.380 --> 00:12:06.000
+I could just do an incremental search for wildflowers
+
+00:12:06.000 --> 00:12:07.920
+and jump through that. It's pretty simple.
+
+00:12:07.920 --> 00:12:13.200
+Not very impressive, but honestly, most of the time
+
+00:12:13.200 --> 00:12:16.439
+that gets me there pretty quick.
+
+00:12:16.440 --> 00:12:20.360
+Sometimes I find it useful to do an Occur search,
+
+00:12:20.360 --> 00:12:23.240
+more specifically a Helm Occur search.
+
+00:12:23.240 --> 00:12:31.259
+If I use the `helm-occur` command,
+
+00:12:31.260 --> 00:12:34.680
+then I like to use this to search by tag.
+
+00:12:34.680 --> 00:12:36.760
+That's where it really becomes handy.
+
+00:12:36.760 --> 00:12:39.207
+Let's say I want to narrow it down
+
+00:12:39.207 --> 00:12:42.640
+to all my astronomy references
+
+00:12:42.640 --> 00:12:50.039
+and then narrow it down a little bit more to planets.
+
+00:12:50.040 --> 00:12:54.119
+I can put spaces in between and it still works.
+
+00:12:54.120 --> 00:12:57.199
+You can see here in one window,
+
+00:12:57.200 --> 00:13:00.239
+it gives me the bottom window there.
+
+00:13:00.240 --> 00:13:03.479
+It's giving…, just because of the way
+
+00:13:03.480 --> 00:13:06.440
+the tags are formatted with the title, it gives me
+
+00:13:06.440 --> 00:13:09.519
+a list of all the titles that have those tags.
+
+00:13:09.520 --> 00:13:11.520
+And I usually find what I want pretty quick
+
+00:13:11.520 --> 00:13:13.400
+by just tapping through here.
+
+00:13:13.400 --> 00:13:16.499
+Once I find the one that I think I want,
+
+00:13:16.500 --> 00:13:24.139
+I press enter, and now I'm focused on just that entry.
+
+00:13:24.140 --> 00:13:26.960
+There is some advanced functionality, I believe,
+
+00:13:26.960 --> 00:13:29.960
+that I used in the past where you could search
+
+00:13:29.960 --> 00:13:33.119
+based on the property fields.
+
+00:13:33.120 --> 00:13:37.880
+So do something like search for publication —
+
+00:13:37.880 --> 00:13:42.439
+the most recent publications in the last 10 years.
+
+00:13:42.440 --> 00:13:46.200
+There's some kind of advanced syntax for that,
+
+00:13:46.200 --> 00:13:48.219
+which I used once or twice.
+
+00:13:48.220 --> 00:13:51.400
+Honestly, I use that so infrequently
+
+00:13:51.400 --> 00:13:54.840
+that I have to go back to the Emacs manual
+
+00:13:54.840 --> 00:13:57.739
+and figure it out each time, and figure out again
+
+00:13:57.740 --> 00:13:59.880
+how I did that the last time.
+
+00:13:59.880 --> 00:14:02.000
+But since I do it only once
+
+00:14:02.000 --> 00:14:06.679
+every three or four months, it's not a problem.
+
+00:14:06.680 --> 00:14:11.519
+So I'm not going to go over that today.
+
+00:14:11.520 --> 00:14:16.479
+That's pretty much it in a nutshell.
+
+00:14:16.480 --> 00:14:19.974
+Again, the code that I wrote, this specific approach
+
+00:14:19.974 --> 00:14:24.279
+is not really what I'm recommending.
+
+00:14:24.280 --> 00:14:31.160
+But here it is if you really do want to use it.
+
+00:14:31.160 --> 00:14:36.239
+Maybe I can make a link to the URL
+
+00:14:36.240 --> 00:14:40.059
+and share that in the chat room or something.
+
+00:14:40.060 --> 00:14:46.759
+But I consider this to be trivial code.
+
+00:14:46.760 --> 00:14:49.799
+So just use that if you want to use it.
+
+00:14:49.800 --> 00:14:53.440
+I should be signing off here now.
+
+00:14:53.440 --> 00:14:58.259
+I should be in the chat room, in the IRC chat room,
+
+00:14:58.260 --> 00:15:01.920
+or you can reach out to me by email if you'd like.
+
+00:15:01.920 --> 00:15:04.320
+Thank you very much.
diff --git a/2023/captions/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--main.vtt b/2023/captions/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--main.vtt
new file mode 100644
index 00000000..61834255
--- /dev/null
+++ b/2023/captions/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--main.vtt
@@ -0,0 +1,572 @@
+WEBVTT
+
+00:00.000 --> 00:04.000
+Hello, I'm Alexey Bychkadov, and I'm talking about
+
+00:04.000 --> 00:07.000
+unentangling projects and repositories,
+
+00:07.000 --> 00:10.000
+or maybe entangling them, depending on how you look at that.
+
+00:12.000 --> 00:15.000
+So that's going to be a short workflow note.
+
+00:15.000 --> 00:19.000
+I work as a researcher,
+
+00:19.000 --> 00:23.000
+so there are three main components to my work, I guess.
+
+00:23.000 --> 00:27.000
+First, I think, so I try to come up with new ideas,
+
+00:27.000 --> 00:31.000
+and that usually results in some collection of notes I have.
+
+00:31.000 --> 00:35.000
+Second, I try things out, so it usually means that I write code.
+
+00:35.000 --> 00:39.000
+And third, I communicate, so I prepare papers,
+
+00:39.000 --> 00:43.000
+presentations, memos, and so on and so forth.
+
+00:43.000 --> 00:47.000
+And so the workflow problem I had is
+
+00:47.000 --> 00:51.000
+sometimes all this does not really fit
+
+00:51.000 --> 00:55.000
+into a concept of a single repository per project,
+
+00:55.000 --> 00:59.000
+so I might want to have, for example,
+
+00:59.000 --> 01:03.000
+a source code in one repository, and then I would like to have a paper
+
+01:03.000 --> 01:07.000
+in another one, and then I want to have a collection of notes somewhere
+
+01:07.000 --> 01:11.000
+unrelated to those two. And yeah,
+
+01:11.000 --> 01:15.000
+Emacs is pretty good at supporting your workflows, and I figured I should
+
+01:15.000 --> 01:19.000
+share what I use and what works for me.
+
+01:19.000 --> 01:23.000
+So,
+
+01:23.000 --> 01:27.000
+from the technical perspective, things are
+
+01:27.000 --> 01:31.000
+pretty easy, so I use a collection of pretty standard components
+
+01:31.000 --> 01:35.000
+of Emacs, so it's a projectile org-mode with its capture templates and other
+
+01:35.000 --> 01:39.000
+things. Then I sustain a collection of notes in something
+
+01:39.000 --> 01:43.000
+that is called org-roam, which is, well, essentially, it's a glorified
+
+01:43.000 --> 01:47.000
+collection of org-mode files. Then I use directory
+
+01:47.000 --> 01:51.000
+local variables, maybe a ctext to jump through the source code,
+
+01:51.000 --> 01:55.000
+and very, very little Elisp glue to make this
+
+01:55.000 --> 01:59.000
+all work, but that's not really rocket science.
+
+01:59.000 --> 02:03.000
+So that's the workflow I would like to talk about today.
+
+02:03.000 --> 02:07.000
+So, what I mean by all that,
+
+02:07.000 --> 02:11.000
+it's pretty straightforward to make
+
+02:11.000 --> 02:15.000
+it easy to jump around a single repository in Emacs.
+
+02:15.000 --> 02:19.000
+Now, I have Doom Emacs, but that's not really specific to Doom.
+
+02:19.000 --> 02:23.000
+That'll work in any Emacs configuration.
+
+02:23.000 --> 02:27.000
+Well, kbindings might be
+
+02:27.000 --> 02:31.000
+different, but that's not the point, I guess, for the workflow. So, if I hit space
+
+02:31.000 --> 02:35.000
+two times, I have all the list of files within my project.
+
+02:35.000 --> 02:39.000
+So, if I create a couple of custom shortcuts,
+
+02:39.000 --> 02:43.000
+so if I press a magic button,
+
+02:43.000 --> 02:47.000
+hyperlp, don't worry about hyperkey, so I want it to have a
+
+02:47.000 --> 02:51.000
+modifier key all to myself, so that would, no program
+
+02:51.000 --> 02:55.000
+on my computer would use that except Emacs, and Emacs would
+
+02:55.000 --> 02:59.000
+use that only when I tell it to, so I have a hyperkey instead of caps lock, that's pretty easy
+
+02:59.000 --> 03:03.000
+to do in GNU Linux system. So,
+
+03:03.000 --> 03:07.000
+when I press this magic keys, I have a menu that's a normal
+
+03:07.000 --> 03:11.000
+kbinding, yeah, essentially in Emacs, and
+
+03:11.000 --> 03:15.000
+if I hit, for example, R, I end up in a readme file within
+
+03:15.000 --> 03:19.000
+this specific repository I was sitting in, right, so if I want to document something
+
+03:19.000 --> 03:23.000
+real quick, I go to the readme file. Then I could have, I could
+
+03:23.000 --> 03:27.000
+go to a changelog file, right, so I have a list of changes
+
+03:27.000 --> 03:31.000
+and the way it works, usually, for example, if I'm working on some code,
+
+03:31.000 --> 03:35.000
+I created a couple of dummy files in there, so
+
+03:35.000 --> 03:39.000
+I'm working on some code, and then I implemented something, and I can
+
+03:39.000 --> 03:43.000
+just use the org mode capture
+
+03:43.000 --> 03:47.000
+mechanisms to keep track of what
+
+03:47.000 --> 03:51.000
+I want to discuss with colleagues next time, for example, I could just hit
+
+03:51.000 --> 03:55.000
+capture repo specific changelog entry
+
+03:55.000 --> 03:59.000
+and I implemented a feature
+
+03:59.000 --> 04:03.000
+and I can continue working
+
+04:03.000 --> 04:07.000
+without this context switching, and then if I want to go to the changelog,
+
+04:07.000 --> 04:11.000
+well, it is there, and next time I talk
+
+04:11.000 --> 04:15.000
+to the colleagues about the source code, I can open the changelog and go through entries one by one
+
+04:15.000 --> 04:19.000
+and discuss what I have implemented last time.
+
+04:19.000 --> 04:23.000
+I could go to project specific
+
+04:23.000 --> 04:27.000
+to, sorry, to repo specific to-do list, and I have
+
+04:27.000 --> 04:31.000
+a list of to-dos that would live within a repository, and
+
+04:31.000 --> 04:35.000
+for example, I could have a high-level structure here,
+
+04:35.000 --> 04:39.000
+work distribution between team members and other things that sort of face
+
+04:39.000 --> 04:43.000
+the world, so to speak, and of course,
+
+04:43.000 --> 04:47.000
+there are very many ways to jump through the source code conveniently,
+
+04:47.000 --> 04:51.000
+I ended up not using language servers, I used a special program called
+
+04:51.000 --> 04:55.000
+ctags, and so the way it works is just I call
+
+04:55.000 --> 04:59.000
+projectile regenerate tags, and it creates the special
+
+04:59.000 --> 05:03.000
+tags file within the repository,
+
+05:03.000 --> 05:07.000
+and then I can, again, run
+
+05:07.000 --> 05:11.000
+I usually just hit a single keystroke,
+
+05:11.000 --> 05:15.000
+and here is all the symbols that are there in my
+
+05:15.000 --> 05:19.000
+source code, regardless of the language, right, so I can jump to the main function
+
+05:19.000 --> 05:23.000
+and that'll be a C++ file, or I could go to the super function, which I
+
+05:23.000 --> 05:27.000
+had in my Python file, and this comes in pretty convenient if I have
+
+05:27.000 --> 05:31.000
+a mixture of languages, so sometimes I can have some algorithm-specific code
+
+05:31.000 --> 05:35.000
+in Julia, and then I can have some Python glue within the same
+
+05:35.000 --> 05:39.000
+source code repository, and it makes it really convenient to jump
+
+05:39.000 --> 05:43.000
+between all of those, right,
+
+05:43.000 --> 05:47.000
+but I have a few problems here,
+
+05:47.000 --> 05:51.000
+just to give you a little bit of context, for example, here is the
+
+05:51.000 --> 05:55.000
+a real project that corresponds to a real paper,
+
+05:55.000 --> 05:59.000
+I have a single note about that project,
+
+05:59.000 --> 06:03.000
+where I keep all the things related to that project here, but that's a private
+
+06:03.000 --> 06:07.000
+note, so for example, again, I hit a special key that
+
+06:07.000 --> 06:11.000
+invokes my org-roam function that gives me a menu of my
+
+06:11.000 --> 06:15.000
+notes, and so here is the paper,
+
+06:15.000 --> 06:19.000
+essentially, and I can have a paper timeline, and I can
+
+06:19.000 --> 06:23.000
+have a list of all the dates, what happened to the paper, with links
+
+06:23.000 --> 06:27.000
+to my email, right, so for example, if I hit this link,
+
+06:27.000 --> 06:31.000
+that'll open a specific email, and that doesn't work outside of my
+
+06:31.000 --> 06:35.000
+computer, it doesn't make any sense to keep it in the outer world-facing
+
+06:35.000 --> 06:39.000
+repository, for example, so that's something to myself, right, sometimes I want
+
+06:39.000 --> 06:43.000
+to have, like, this list of
+
+06:43.000 --> 06:47.000
+working notes, right, that contain, like, for example,
+
+06:47.000 --> 06:51.000
+I might produce this kind of things for internal discussion, right,
+
+06:51.000 --> 06:55.000
+it has some marks, it has some margin notes, and things like that,
+
+06:55.000 --> 06:59.000
+maybe, again, health-based ideas that may or may not end up
+
+06:59.000 --> 07:03.000
+in a repository, in a final paper, or in a source code,
+
+07:03.000 --> 07:07.000
+but still I want to have it somewhere, and
+
+07:07.000 --> 07:11.000
+well, long story short, I need a project folder
+
+07:11.000 --> 07:15.000
+that would be unrelated to the source code, or
+
+07:15.000 --> 07:19.000
+to the source code repository, or to the paper itself,
+
+07:19.000 --> 07:23.000
+or a final report, right, and one way,
+
+07:23.000 --> 07:27.000
+as usual, there are multiple ways to achieve that, I suppose, and one way to do that
+
+07:27.000 --> 07:31.000
+is, so, I create
+
+07:31.000 --> 07:35.000
+a special folder within my org-roam
+
+07:35.000 --> 07:39.000
+storage, so it's a special folder outside of any
+
+07:39.000 --> 07:43.000
+repositories that got backed up to my hard drive, with
+
+07:43.000 --> 07:47.000
+certain redundancy, but I don't really need, like, version control, full-blown
+
+07:47.000 --> 07:51.000
+version control for that, I'm okay with just having a couple of backups, right, so
+
+07:51.000 --> 07:55.000
+this is the folder you see here, so pkb stands for personal knowledge
+
+07:55.000 --> 07:59.000
+base, and I have a folder, project notes in there, right, so
+
+07:59.000 --> 08:03.000
+and, how does it work, so I have a
+
+08:03.000 --> 08:07.000
+folder per project in there, essentially, and here I can
+
+08:07.000 --> 08:11.000
+have all the stuff that is, that kind of belongs to me, and I
+
+08:11.000 --> 08:15.000
+do not publish it anywhere, and then
+
+08:15.000 --> 08:19.000
+for example, a source code
+
+08:19.000 --> 08:23.000
+repository knows about that folder, and a paper repository
+
+08:23.000 --> 08:27.000
+knows about that folder, and anything else that might live in separate
+
+08:27.000 --> 08:31.000
+places all over my system can know about that folder, and how do I achieve that,
+
+08:31.000 --> 08:35.000
+well, essentially, this is one of the use cases for the directory
+
+08:35.000 --> 08:39.000
+local variables, right, so, for example,
+
+08:39.000 --> 08:43.000
+how does it work from the user perspective, so if I hit a special
+
+08:43.000 --> 08:47.000
+key, oh, sorry, if I hit a special key
+
+08:47.000 --> 08:51.000
+that would be open project
+
+08:51.000 --> 08:55.000
+and then, for example,
+
+08:55.000 --> 08:59.000
+org mode file, right, so this is my personal notes about the emacs conf, not
+
+08:59.000 --> 09:03.000
+specifically about this very talk, but I can have, you know,
+
+09:03.000 --> 09:07.000
+half-baked ideas here, again, presentation tools, and things like that,
+
+09:07.000 --> 09:11.000
+and how does that happen if we try to
+
+09:11.000 --> 09:15.000
+look at the code, the elisp magic here, what
+
+09:15.000 --> 09:19.000
+is happening is, it's just a couple lines of code, in fact, so
+
+09:19.000 --> 09:23.000
+let me just press control, help
+
+09:23.000 --> 09:27.000
+key, and so the key I was
+
+09:27.000 --> 09:31.000
+pressing is open project org mode file, and so
+
+09:31.000 --> 09:35.000
+what we see here, there is a single, so it's just a call to a find
+
+09:35.000 --> 09:39.000
+file function, so I open that file, and there is a special function that
+
+09:39.000 --> 09:43.000
+figures out what is the, like, umbrella
+
+09:43.000 --> 09:47.000
+project notes file, and that's, again, that's very easy, so
+
+09:47.000 --> 09:51.000
+essentially, if a variable describing this
+
+09:51.000 --> 09:55.000
+the name for that project is defined, then
+
+09:55.000 --> 09:59.000
+I use that as my project folder name, if not, I take the project name from the
+
+09:59.000 --> 10:03.000
+project towel, and well, that's pretty much it,
+
+10:03.000 --> 10:07.000
+and how do I define this
+
+10:07.000 --> 10:11.000
+variable is, essentially, there is this
+
+10:11.000 --> 10:15.000
+magical file in a folder called dear locals elisp,
+
+10:15.000 --> 10:19.000
+and I just put it there, and then, whenever I
+
+10:19.000 --> 10:23.000
+go into that folder, or any of its children folders, I get this
+
+10:23.000 --> 10:27.000
+variable defined, and that's pretty much it, that's how
+
+10:27.000 --> 10:31.000
+it works for me.
+
+10:31.000 --> 10:35.000
+I guess one thing that I wanted to emphasize
+
+10:35.000 --> 10:39.000
+specifically about that is, of course, it's
+
+10:39.000 --> 10:43.000
+time tracking, right, so what I find especially important when I work in
+
+10:43.000 --> 10:47.000
+something, and I want to clock time, I usually do not want
+
+10:47.000 --> 10:51.000
+this information to be in a source code repository or in a paper repository
+
+10:51.000 --> 10:55.000
+because other people I work with will not be particularly happy about that
+
+10:55.000 --> 10:59.000
+especially if most of them do not use Emacs, and they will see
+
+10:59.000 --> 11:03.000
+this long list of org clocked data, and that doesn't look
+
+11:03.000 --> 11:07.000
+nice in a plain text format, so what I usually
+
+11:07.000 --> 11:11.000
+do if I want to clock in some time, and then later analyze what I've
+
+11:11.000 --> 11:15.000
+been spending time on, so I go to my org mode file
+
+11:15.000 --> 11:19.000
+and I go to my current project
+
+11:19.000 --> 11:23.000
+to-dos, and I clock in there, and that's
+
+11:23.000 --> 11:27.000
+how it works, so again
+
+11:27.000 --> 11:31.000
+what comes in handy if I hit ctrl-o, I just go
+
+11:31.000 --> 11:35.000
+back to the file I jumped from, so that's also
+
+11:35.000 --> 11:39.000
+pretty handy, so again, no rocket science in there
+
+11:39.000 --> 11:43.000
+so I create a directory local variable that helps me
+
+11:43.000 --> 11:47.000
+to figure out what umbrella project does
+
+11:47.000 --> 11:51.000
+this particular folder belongs to, and this way
+
+11:51.000 --> 11:55.000
+I make Emacs aware of, for example, facts like so this
+
+11:55.000 --> 11:59.000
+source code belongs to that project, and this repository with the paper
+
+11:59.000 --> 12:03.000
+also belongs to that project, and I can have capture templates
+
+12:03.000 --> 12:07.000
+that would save my notes into my private notes
+
+12:07.000 --> 12:11.000
+file, and my to-dos go to my private note files
+
+12:11.000 --> 12:15.000
+and so on and so forth, so I find it pretty simple, but
+
+12:15.000 --> 12:19.000
+that really helps to reduce this context
+
+12:19.000 --> 12:23.000
+switching, and I don't believe it allows me to save time
+
+12:23.000 --> 12:27.000
+but that probably helps me to stay focused, and this
+
+12:27.000 --> 12:31.000
+is what is really important, I believe, so thank you
+
+12:31.000 --> 12:35.000
+very much, and if you have any comments or suggestions to that, please do jump
+
+12:35.000 --> 12:39.000
+into the discussion, yeah, after the talk, thank you.
+
diff --git a/2023/info/core-before.md b/2023/info/core-before.md
index 3e7eabfe..092be180 100644
--- a/2023/info/core-before.md
+++ b/2023/info/core-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2023-12-02.
Format: 40-min talk; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2023/current/bbb-core.html>
Etherpad: <https://pad.emacsconf.org/2023-core>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Waiting for video from speaker
-<div>Times in different timezones:</div><div class="times" start="2023-12-02T21:10:00Z" end="2023-12-02T21:50:00Z"><div class="conf-time">Saturday, Dec 2 2023, ~4:10 PM - 4:50 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 2 2023, ~3:10 PM - 3:50 PM CST (US/Central)<br />Saturday, Dec 2 2023, ~2:10 PM - 2:50 PM MST (US/Mountain)<br />Saturday, Dec 2 2023, ~1:10 PM - 1:50 PM PST (US/Pacific)<br />Saturday, Dec 2 2023, ~9:10 PM - 9:50 PM UTC <br />Saturday, Dec 2 2023, ~10:10 PM - 10:50 PM CET (Europe/Paris)<br />Saturday, Dec 2 2023, ~11:10 PM - 11:50 PM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~2:40 AM - 3:20 AM IST (Asia/Kolkata)<br />Sunday, Dec 3 2023, ~5:10 AM - 5:50 AM +08 (Asia/Singapore)<br />Sunday, Dec 3 2023, ~6:10 AM - 6:50 AM JST (Asia/Tokyo)</div></div><div><a href="/2023/watch/gen/">Find out how to watch and participate</a></div>
+Status: All done
+<div class="vid"><div></div><div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2023-core">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2023/current/bbb-core.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-core--emacs-core-development-how-it-works--stefan-kangas--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-core--emacs-core-development-how-it-works--stefan-kangas--intro.webm">Download --intro.webm</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2023/info/devel-before.md b/2023/info/devel-before.md
index 3bd93f44..0f287e0b 100644
--- a/2023/info/devel-before.md
+++ b/2023/info/devel-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2023-12-02.
Format: 10-min talk; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2023/current/bbb-devel.html>
Etherpad: <https://pad.emacsconf.org/2023-devel>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Waiting for video from speaker
-<div>Times in different timezones:</div><div class="times" start="2023-12-02T20:45:00Z" end="2023-12-02T20:55:00Z"><div class="conf-time">Saturday, Dec 2 2023, ~3:45 PM - 3:55 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 2 2023, ~2:45 PM - 2:55 PM CST (US/Central)<br />Saturday, Dec 2 2023, ~1:45 PM - 1:55 PM MST (US/Mountain)<br />Saturday, Dec 2 2023, ~12:45 PM - 12:55 PM PST (US/Pacific)<br />Saturday, Dec 2 2023, ~8:45 PM - 8:55 PM UTC <br />Saturday, Dec 2 2023, ~9:45 PM - 9:55 PM CET (Europe/Paris)<br />Saturday, Dec 2 2023, ~10:45 PM - 10:55 PM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~2:15 AM - 2:25 AM IST (Asia/Kolkata)<br />Sunday, Dec 3 2023, ~4:45 AM - 4:55 AM +08 (Asia/Singapore)<br />Sunday, Dec 3 2023, ~5:45 AM - 5:55 AM JST (Asia/Tokyo)</div></div><div><a href="/2023/watch/gen/">Find out how to watch and participate</a></div>
+Status: All done
+<div class="vid"><div></div><div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2023-devel">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2023/current/bbb-devel.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-devel--emacs-development-updates--john-wiegley--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-devel--emacs-development-updates--john-wiegley--intro.webm">Download --intro.webm</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2023/info/doc-after.md b/2023/info/doc-after.md
index 78cda7d5..0817357c 100644
--- a/2023/info/doc-after.md
+++ b/2023/info/doc-after.md
@@ -1,6 +1,918 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="doc-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello, everyone.""" start="00:00:00.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This talk is on literate documentation""" start="00:00:04.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""with Emacs and org-mode.""" start="00:00:07.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I'm going to take just a moment here""" start="00:00:10.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to unpack what I just said.""" start="00:00:12.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Emacs, as most of us probably already know,""" start="00:00:14.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""is a powerful text editor and list programming environment""" start="00:00:17.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""from the 1970s.""" start="00:00:21.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Chances are, if you're attending this talk,""" start="00:00:23.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you already know a bit about Emacs.""" start="00:00:25.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""org-mode is an Emacs major mode and authoring tool""" start="00:00:28.820" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that helps you write documents in a plain text markup""" start="00:00:32.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""language called Org.""" start="00:00:36.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""These Org documents can be exported""" start="00:00:37.740" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to a number of different document formats,""" start="00:00:40.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""like HTML, PDF, ODT, Markdown, and more.""" start="00:00:42.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""org-mode has a lot of features.""" start="00:00:48.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""It can be an outliner, a to-do list manager,""" start="00:00:51.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""an agenda, organizer, and much more.""" start="00:00:54.240" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Today, we're going to be demonstrating""" start="00:00:57.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""what I consider to be org-mode's killer feature called""" start="00:00:59.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Org Babel.""" start="00:01:03.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Babel allows you to take human language prose,""" start="00:01:04.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""computer language source code blocks, and their outputs""" start="00:01:07.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and weave them together seamlessly""" start="00:01:11.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to form a cohesive document.""" start="00:01:13.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""It is seriously cool.""" start="00:01:16.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Literate documentation is a play on the term""" start="00:01:19.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""literate programming, popularized by Donald Knuth""" start="00:01:21.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in the early 1980s.""" start="00:01:25.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Knuth's literate programming idea""" start="00:01:27.380" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""was that computer programs could be""" start="00:01:29.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""expressed in a natural language and be""" start="00:01:31.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""human-readable documents rather than written exclusively""" start="00:01:34.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""for machines to read.""" start="00:01:38.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""In a traditional program, you might""" start="00:01:40.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""have a bunch of machine-readable source code""" start="00:01:43.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and a handful of human-readable comments,""" start="00:01:45.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which attempt to describe what the program is doing.""" start="00:01:48.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Literate programming flips this on its head.""" start="00:01:51.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""A literate program is a document that""" start="00:01:54.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""describes how the program works with machine-readable source""" start="00:01:56.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""code blocks inside of it.""" start="00:02:01.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""These source code blocks are later""" start="00:02:02.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""tangled out of the document and submitted to the machine""" start="00:02:04.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""either to be compiled or interpreted and ultimately run.""" start="00:02:08.440" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Throughout this presentation, you'll""" start="00:02:14.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""see my browser window here on the left side of the screen.""" start="00:02:15.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And on the right side, I've got a terminal session""" start="00:02:19.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""running tmux.""" start="00:02:22.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This allows us to have a virtual terminal window connected""" start="00:02:23.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to two separate Linux machines, one running Ubuntu Server 2204""" start="00:02:28.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and another running Fedora Server 38.""" start="00:02:35.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I've specifically chosen these two distributions for my demo""" start="00:02:39.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because they are representative of the two dominant flavors""" start="00:02:43.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of GNU Linux, Debian and RedHat.""" start="00:02:46.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""In both cases, these are bare-bones server additions""" start="00:02:49.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""with the stock packages installed.""" start="00:02:53.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I've manually installed a few packages like Git, emacs-noex""" start="00:02:55.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to get the terminal version of emacs, and tmux.""" start="00:03:00.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""But otherwise, these Linux installs""" start="00:03:04.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""are what you'd get right out of the box.""" start="00:03:06.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""For this demo, I've created a literate org-mode document""" start="00:03:08.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that describes how to build GNU Emacs from its source code""" start="00:03:12.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on both Debian and RedHat-based systems.""" start="00:03:16.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""While both operating systems are very similar,""" start="00:03:19.940" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""they differ substantially on which packages""" start="00:03:22.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""are installed out of the box, how optional packages are""" start="00:03:25.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""named, searched, and installed, and of course,""" start="00:03:29.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the distributions have different names,""" start="00:03:32.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""like Ubuntu or Fedora.""" start="00:03:34.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I chose building Emacs from source""" start="00:03:36.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""as a topic for this demonstration""" start="00:03:39.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because while the process is largely""" start="00:03:41.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the same on both RedHat and Debian,""" start="00:03:43.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""there are a lot of minor little differences""" start="00:03:46.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that need to be accounted for, which really prohibits you""" start="00:03:49.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""from hard coding names of packages and package management""" start="00:03:52.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""tools and distributions into your document.""" start="00:03:57.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I suppose you could create two versions of the same document,""" start="00:04:01.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""one specifically for RedHat and one specifically for Debian,""" start="00:04:05.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but that would be really tedious to maintain.""" start="00:04:09.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Like if, for example, you updated some prose""" start="00:04:13.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in one document, you'd have to remember""" start="00:04:16.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to do it in the other one too.""" start="00:04:18.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And if you weren't careful, the two documents""" start="00:04:20.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""could drift out of sync.""" start="00:04:22.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""In this demo, I'll show you techniques""" start="00:04:25.260" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""for creating dynamic, literate documents that""" start="00:04:27.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""can change based on parameters and constants embedded""" start="00:04:30.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""into the non-exported regions of the document.""" start="00:04:34.620" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I'll show how with a single org-mode source document,""" start="00:04:38.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you can press a couple of keys to configure""" start="00:04:41.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""it to export a RedHat-specific version of my building""" start="00:04:44.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Emacs from source essay or a Debian-specific version.""" start="00:04:48.720" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""All right, let's get started.""" start="00:04:53.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll begin by firing up a new terminal Emacs session""" start="00:04:55.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on my Ubuntu machine.""" start="00:04:58.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now, I installed Emacs on this machine using apt-get.""" start="00:05:00.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And doing that, you get version 27.1,""" start="00:05:04.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which is, hey, only two major versions""" start="00:05:07.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""behind the current version of Emacs.""" start="00:05:10.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This is another reason why I thought""" start="00:05:13.011" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""writing a guide on how to build Emacs from source code""" start="00:05:15.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""might be a good idea.""" start="00:05:18.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""You can get a much newer version of Emacs on Ubuntu""" start="00:05:19.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""if you install it via Snap, but, uh, Snaps.""" start="00:05:22.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Don't get me started.""" start="00:05:25.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now, I wanted to use a completely vanilla""" start="00:05:28.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""terminal mode install of Emacs for this demonstration""" start="00:05:30.922" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because my personal Emacs config has a ton of packages""" start="00:05:34.620" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""installed and is heavily modified.""" start="00:05:38.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I want folks to be able to follow along""" start="00:05:41.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""with a bog-standard, out-of-the-box Emacs config.""" start="00:05:43.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The Emacs config on this Ubuntu machine""" start="00:05:47.580" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""has just two settings.""" start="00:05:49.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I require org-tempo because my fingers are hardwired""" start="00:05:51.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to use some of the handy shortcuts that it provides.""" start="00:05:55.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And I also turn off the menu bar""" start="00:05:58.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because I just can't stand to look at it.""" start="00:06:00.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Let's begin by opening a file called buildemacs.org,""" start="00:06:03.140" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which will be the source code""" start="00:06:07.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""for our literate org-mode document.""" start="00:06:08.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now, in preparation for this talk,""" start="00:06:11.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I've already written this document,""" start="00:06:12.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and we'll take a look at the finished product""" start="00:06:14.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""here in a bit, but let's first take a look""" start="00:06:17.980" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""at how we might approach this task.""" start="00:06:19.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll start at the top of the document""" start="00:06:22.409" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""by filling out some export keywords.""" start="00:06:24.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""These keywords are something that every backend exporter,""" start="00:06:27.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""be it LaTeX or plain text or ODT or whatever, understands,""" start="00:06:30.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and they're essentially document metadata.""" start="00:06:35.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""As you can see, I'm typing `#+`""" start="00:06:38.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""followed by a couple characters""" start="00:06:42.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then `M-TAB` to auto-complete.""" start="00:06:43.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If you hit #+ by itself and then M-TAB,""" start="00:06:45.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you can see all the possible completions.""" start="00:06:50.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And as you can see, there's a lot.""" start="00:06:53.120" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""The next thing we're gonna do is make a README section""" start="00:06:55.780" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""at the top of this document.""" start="00:06:58.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This section is intended for folks""" start="00:06:59.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""who are looking at the org-mode document,""" start="00:07:02.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""trying to figure out what it's for.""" start="00:07:04.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We don't want to actually export the section heading,""" start="00:07:06.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""so we're gonna tag it with the :noexport: tag.""" start="00:07:09.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then here, we just write something quick""" start="00:07:13.860" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to let folks know that this document""" start="00:07:15.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""can potentially execute code""" start="00:07:17.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and just a little something about what the document is for.""" start="00:07:19.800" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Okay, so now that we've written some text,""" start="00:07:23.500" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""let's try our hand at writing a code block.""" start="00:07:26.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I'm getting pretty sick of looking at""" start="00:07:29.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the default Emacs theme.""" start="00:07:31.289" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""All that blue and purple in the document""" start="00:07:32.940" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""makes it look bruised.""" start="00:07:35.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Let's make an Emacs Lisp code block""" start="00:07:37.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that switches the theme""" start="00:07:40.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to one of my favorite built-in themes, Leuven.""" start="00:07:41.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Leuven was created by my man, Fabrice Niessen,""" start="00:07:44.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""who I personally have learned a ton of org-mode stuff about""" start="00:07:48.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""just by studying his work.""" start="00:07:52.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now, if we cruise back up to the code block,""" start="00:07:54.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we should be able to hit `C-c C-c`,""" start="00:07:56.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and have it execute.""" start="00:07:58.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And there you have it, a high-contrast color theme""" start="00:08:00.380" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that was designed to look great in org-mode.""" start="00:08:03.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So that's great and all,""" start="00:08:06.980" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but there are a couple of things I don't like.""" start="00:08:08.080" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""First of all, we don't need to see a #+RESULTS block here,""" start="00:08:10.460" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and that's because we're not really interested""" start="00:08:13.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in what the Emacs Lisp function `load-theme` returns.""" start="00:08:15.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I mean, it's great it returned t and all to indicate success,""" start="00:08:18.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we just don't need to see it.""" start="00:08:22.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We can slap a `:results none` header arg""" start="00:08:23.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on the code block to keep things nice and clean.""" start="00:08:26.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""There are a lot of different header args,""" start="00:08:30.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and I often confuse and misremember them.""" start="00:08:32.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So I'll always refer back to the org-mode manual""" start="00:08:35.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""when working with them.""" start="00:08:38.920" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""The second thing I don't like is that""" start="00:08:40.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""when we hit C-c C-c to execute the block,""" start="00:08:42.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Emacs prompted us if we really wanted to run the block.""" start="00:08:46.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Emacs Lisp is Emacs' mother tongue,""" start="00:08:49.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and I don't wanna be hassled when speaking""" start="00:08:52.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""my native language.""" start="00:08:53.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""There's a variable that controls this""" start="00:08:55.380" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""called `org-confirm-babel-evaluate`.""" start="00:08:57.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And this can be either set to t or nil""" start="00:09:00.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to either always confirm or never confirm.""" start="00:09:03.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If however, you provided a lambda, an anonymous function,""" start="00:09:06.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Org will call your function with the name of the language""" start="00:09:10.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and the source block that it's about to run.""" start="00:09:14.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And your function can make the decision""" start="00:09:16.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""about if Emacs should ask you for confirmation or not.""" start="00:09:19.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""What I'm doing here is setting `org-confirm-babel-evaluate`""" start="00:09:24.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""as a &quot;file local variable&quot;.""" start="00:09:27.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This means whenever the file is opened by Emacs,""" start="00:09:30.540" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""it'll set this variable to be a lambda that returns nil,""" start="00:09:33.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""meaning don't confirm, on Elisp code blocks.""" start="00:09:38.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""As you can see, the variable is currently set""" start="00:09:42.860" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to its default value of t, meaning always confirm.""" start="00:09:45.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now if we save the buffer, exit Emacs,""" start="00:09:50.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and pop back in again,""" start="00:09:53.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""`org-confirm-babel-evaluate` should be set how we like it.""" start="00:09:55.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We were however prompted for confirmation""" start="00:10:00.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on setting the file-local variable,""" start="00:10:02.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which controls if we're prompted""" start="00:10:04.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""for Elisp source code block evaluation.""" start="00:10:06.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I feel like there's a Yo Dawg joke here somewhere.""" start="00:10:09.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""When we were prompted, we hit the exclamation mark,""" start="00:10:12.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which automatically marks this variable as being safe.""" start="00:10:15.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So you won't be bothered the next time you open this file.""" start="00:10:18.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This variable is called `safe-local-variable-values`""" start="00:10:21.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and if we pop over to our .emacs file,""" start="00:10:26.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you can see that Emacs' customize tooling""" start="00:10:29.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""helpfully updated this variable in our config file for us.""" start="00:10:32.520" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Now that's great and all,""" start="00:10:36.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but I really don't like having to hit `C-c C-c`""" start="00:10:38.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on that source block every time I open this document""" start="00:10:42.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""just to bring up the Leuven theme.""" start="00:10:45.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Let's have this source block run automatically""" start="00:10:47.740" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""every time the document is opened.""" start="00:10:50.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now I know what you're thinking.""" start="00:10:53.180" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Shouldn't you just put all of this configuration stuff""" start="00:10:55.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in your .emacs file and keep it out of the document?""" start="00:10:57.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Well, that's what I've done with my personal Emacs config,""" start="00:11:01.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but we want this document to be able to be used by folks""" start="00:11:04.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""with a completely vanilla Emacs setup,""" start="00:11:08.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""or even a completely tricked out Emacs setup,""" start="00:11:11.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""so we can't assume anything.""" start="00:11:13.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The idea is if the Emacs user who opens the document""" start="00:11:16.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""agrees to setting all of the variables""" start="00:11:19.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and running all of the code within,""" start="00:11:22.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""they'll be able to export the document""" start="00:11:24.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""as well as run all of the code blocks inside of it""" start="00:11:26.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""just as we intended.""" start="00:11:28.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And the differences in base Emacs configuration""" start="00:11:30.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""will be completely minimized.""" start="00:11:33.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now it's worth pointing out that the file-local variables""" start="00:11:35.980" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we're setting here are local, in this case, buffer-local.""" start="00:11:39.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The configuration we use in this document""" start="00:11:43.024" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""won't override someone's carefully constructed""" start="00:11:45.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""org-mode setup.""" start="00:11:48.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The first thing we're gonna wanna do""" start="00:11:49.500" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in order to make this block execute""" start="00:11:51.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""when the document is loaded is to give it a name.""" start="00:11:53.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""It's always a good idea to give every source block""" start="00:11:55.989" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you create in your document a unique name,""" start="00:11:58.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""even if you don't refer to it elsewhere.""" start="00:12:01.338" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I do this because when I'm debugging my documents,""" start="00:12:03.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Emacs will prompt me about running a block.""" start="00:12:07.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If the block has a name, Emacs mentions it,""" start="00:12:10.020" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and I know there's a problem with the result caching""" start="00:12:12.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""or something with the &quot;foo&quot; block.""" start="00:12:15.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""But if the block doesn't have a name,""" start="00:12:17.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""it can be really hard to figure out""" start="00:12:20.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which block Emacs is complaining about.""" start="00:12:22.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So I always name my blocks.""" start="00:12:24.580" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now we're gonna add another file local variable,""" start="00:12:27.460" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but this one is special.""" start="00:12:30.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If your &quot;variable&quot;""" start="00:12:32.116" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""just happens to be named &quot;eval&quot;,""" start="00:12:34.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""it means that Emacs should evaluate""" start="00:12:36.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the Lisp expression that follows.""" start="00:12:38.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Here we'll use the progn function""" start="00:12:40.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to sequentially run two elisp functions""" start="00:12:43.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and return the value of the last one executed.""" start="00:12:46.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The first function is `org-babel-goto-named-source-block`,""" start="00:12:48.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which jumps us to the startup block.""" start="00:12:53.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The second one is `org-babel-execute-src-block`,""" start="00:12:55.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which executes the current source block.""" start="00:12:59.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""That should get the job done.""" start="00:13:02.093" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now all we have to do is save the document,""" start="00:13:03.631" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""exit Emacs, jump back in,""" start="00:13:05.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and once we've confirmed that we're willing""" start="00:13:08.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to run the new &quot;eval&quot; line in our file local variables,""" start="00:13:10.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we're good to go.""" start="00:13:14.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now if we want to add new configuration stuff""" start="00:13:15.860" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to the document, we can just add it to the startup block""" start="00:13:18.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and not have to muck about with confirmations""" start="00:13:21.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""or adding new file-local variables or whatever.""" start="00:13:24.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And just like before, we'll let Emacs' customize system""" start="00:13:28.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""save this decision to our .emacs file.""" start="00:13:31.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now that all that business with confirmations,""" start="00:13:34.940" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""file-local variables, and the startup block""" start="00:13:37.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""are out of the way,""" start="00:13:40.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we can get on with writing our introduction.""" start="00:13:41.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll create a new top level headline called introduction""" start="00:13:44.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and explain to the reader of the exported document""" start="00:13:47.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""what this is all about.""" start="00:13:51.440" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Now as you can see, we've actually hard-coded""" start="00:13:53.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the name of the Linux distro in our prose.""" start="00:13:55.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I promised you a single document that could be""" start="00:13:58.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""for either RedHat or Debian distros,""" start="00:14:00.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""so we can't have this.""" start="00:14:03.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Astute members in the audience have probably been uneasy""" start="00:14:05.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""ever since I hard coded the name &quot;Debian&quot;""" start="00:14:08.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in the README section above.""" start="00:14:11.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""One way of solving this problem is by using exclude tags.""" start="00:14:13.860" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Let's add the `#+EXCLUDE_TAGS` export keyword to our document.""" start="00:14:17.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This keyword tells the exporter,""" start="00:14:21.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""&quot;Hey, if you see a headline tagged with any of these tags,""" start="00:14:24.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""don't export it.&quot;""" start="00:14:27.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""By default, the tag `:noexport:` is excluded.""" start="00:14:29.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And if you'll notice, we tagged our README section""" start="00:14:33.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""with that tag, so it doesn't show up""" start="00:14:36.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in the exported document.""" start="00:14:38.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll keep this tag in the list,""" start="00:14:40.340" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but we'll also add the tag `:redhat:` as a tag to exclude.""" start="00:14:42.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now it's just a matter of creating two introduction""" start="00:14:47.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""sections, one for Debian, one for RedHat.""" start="00:14:50.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And if you want the RedHat version of the document,""" start="00:14:53.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you can just modify the `#+EXCLUDE_TAGS` line""" start="00:14:56.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""at the top of the document.""" start="00:14:59.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Awesome, right?""" start="00:15:00.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Right?""" start="00:15:02.340" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""OK, this is not that great.""" start="00:15:03.540" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Well, it does work.""" start="00:15:05.545" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And you can see if we export the document,""" start="00:15:07.388" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we'll get something that only references Debian,""" start="00:15:10.082" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and the `:noexport:` and `:redhat:`""" start="00:15:12.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""tagged headlines are omitted.""" start="00:15:15.189" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This strategy would work great""" start="00:15:17.451" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""when the RedHat- and Debian-specific sections""" start="00:15:19.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""are substantially different, but that's not""" start="00:15:22.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the case with the introduction.""" start="00:15:24.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We definitely don't want to have to maintain""" start="00:15:26.199" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""two distinct introductions.""" start="00:15:28.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I also noticed that the export tags are included""" start="00:15:30.825" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in the exported document.""" start="00:15:34.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""That's a terrible default. We'll fix that,""" start="00:15:36.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and we'll also ensure that my email address appears""" start="00:15:38.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""at the top of the document.""" start="00:15:42.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Let's also take this opportunity to get rid""" start="00:15:43.372" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of the table of contents.""" start="00:15:45.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We don't need it.""" start="00:15:47.355" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""These are all export option settings""" start="00:15:48.868" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and can be modified using the options keyword""" start="00:15:51.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""at the top of the doc.""" start="00:15:53.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The manual is really your friend here,""" start="00:15:55.509" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""as there are a ton of export options.""" start="00:15:57.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now when we export the document again,""" start="00:16:00.980" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""it should look a lot better.""" start="00:16:03.120" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Now that we've cleaned up the look of the exported document,""" start="00:16:05.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we'll take a look at a better way""" start="00:16:09.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of solving the problem with the introduction.""" start="00:16:10.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Thinking like a programmer for a moment,""" start="00:16:13.378" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""what I really want here is a way of specifying a constant.""" start="00:16:15.519" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Rather than hard-coding the name &quot;Debian&quot; or &quot;RedHat&quot;""" start="00:16:19.735" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""or whatever into my document,""" start="00:16:22.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I want to substitute that text with a symbolic constant,""" start="00:16:24.570" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""named something like &quot;distro&quot;, that can dynamically change""" start="00:16:28.235" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to &quot;Debian&quot; or &quot;RedHat&quot; or &quot;Slackware&quot; or whatever,""" start="00:16:31.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""depending on how the document is configured.""" start="00:16:36.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""In the past, I've come up with some pretty cumbersome ways""" start="00:16:38.690" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of doing this, but eventually I stumbled upon the idea""" start="00:16:41.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of using Org-mode properties""" start="00:16:44.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""as a way of storing these constants.""" start="00:16:46.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Like it says in the docs, properties are key-value pairs""" start="00:16:49.410" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that are associated with an entry""" start="00:16:53.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and they live in a collapsible properties drawer.""" start="00:16:55.170" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Let's do a bit of cleanup on our document""" start="00:16:58.380" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and we'll put things into sections.""" start="00:17:00.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll also add a section for document constants.""" start="00:17:02.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And that's where we'll put the properties drawer""" start="00:17:14.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""with the &quot;distro&quot; property.""" start="00:17:19.560" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Now the question is,""" start="00:17:25.740" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""how do we reference these properties in the document?""" start="00:17:27.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""It turns out there's an Elisp function""" start="00:17:30.100" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""called `org-property-values`, which does what we want.""" start="00:17:32.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If we run it and give it the name of our property,""" start="00:17:35.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""it returns a list with the string &quot;Debian&quot; in it.""" start="00:17:38.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""It's worth noting that this function is named""" start="00:17:42.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""`org-property-values` with values being plural.""" start="00:17:45.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""In org-mode, there could be a property named &quot;foo&quot;""" start="00:17:49.990" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that has different values depending on which heading level""" start="00:17:52.890" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you're at in the document,""" start="00:17:55.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which is why the function returns a list.""" start="00:17:57.610" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""For our purposes though,""" start="00:17:59.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we can just pull off the first value in the list with car""" start="00:18:01.290" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and we're good to go.""" start="00:18:04.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now we'll make an Emacs Lisp list function called `get_prop`""" start="00:18:05.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that does just that.""" start="00:18:10.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This function takes one argument called `prop`,""" start="00:18:11.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which is the property to look up""" start="00:18:14.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and we'll give it a default value of &quot;distro&quot;.""" start="00:18:15.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So we can hit `C-c C-c` on the block""" start="00:18:18.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to verify that it works.""" start="00:18:20.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now we just have to make an inline call""" start="00:18:23.150" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to our `get_prop` function""" start="00:18:25.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""within the prose of the introduction section.""" start="00:18:26.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And that should get us much closer""" start="00:18:29.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to not hard coding distro names into our document.""" start="00:18:31.660" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""But before we do that,""" start="00:18:35.620" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I need to clean up something that's been bothering me.""" start="00:18:36.870" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""By default, Emacs' `fill-column` variable""" start="00:18:39.850" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""is set to 70 characters,""" start="00:18:42.910" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which may have been appropriate for 1970,""" start="00:18:44.990" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but it's not great for 2023.""" start="00:18:47.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll just cruise up to our startup block""" start="00:18:51.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and set the variable there.""" start="00:18:53.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll hit `C-c C-c`,""" start="00:18:56.540" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and now our document will wrap at 100 columns,""" start="00:18:58.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which for our purposes, I think is much more reasonable.""" start="00:19:02.290" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The org-mode syntax for making an inline function call""" start="00:19:05.830" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""within the prose of your document is `call_`,""" start="00:19:09.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""followed by the name of the function,""" start="00:19:13.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""some optional header arguments,""" start="00:19:15.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then the function arguments.""" start="00:19:17.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now, when we export the document,""" start="00:19:19.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we see that it's replaced our previously hard coded &quot;Debian&quot;""" start="00:19:21.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""with the value from the property. Huzzah!""" start="00:19:26.050" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now this is close to, but not exactly what we want.""" start="00:19:29.410" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""You can see that &quot;Debian&quot; is surrounded by a backtick""" start="00:19:32.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and a single quote,""" start="00:19:36.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which is the plain text exporters way""" start="00:19:37.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of showing you verbatim text.""" start="00:19:40.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""In more sophisticated document backends,""" start="00:19:43.030" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""verbatim text is rendered in monospace.""" start="00:19:45.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We can fix that by adding a &quot;:results raw&quot; header argument""" start="00:19:49.380" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to the inline call.""" start="00:19:54.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now, when we export the document,""" start="00:19:56.460" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""it looks like what we'd expect.""" start="00:19:58.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now this is getting better, but it's still not great.""" start="00:20:00.290" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""The `call_` syntax is pretty cumbersome,""" start="00:20:03.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and it's a lot to type every time we want""" start="00:20:05.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to reference a constant""" start="00:20:08.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and not have it be marked up as verbatim.""" start="00:20:09.850" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This is where org-mode macros come to our rescue.""" start="00:20:13.220" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If we head to the top of the document,""" start="00:20:17.170" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we can create a couple of macros""" start="00:20:19.470" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""using the `#+MACRO:` export keyword.""" start="00:20:21.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll define two macros with short names.""" start="00:20:24.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""One named &quot;p&quot; for &quot;property&quot;,""" start="00:20:27.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and the other one named &quot;pr&quot; for &quot;property raw&quot;.""" start="00:20:30.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Org-mode macros are expanded when the document is exported,""" start="00:20:34.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and any positional arguments provided""" start="00:20:39.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""are referenced by their number.""" start="00:20:41.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now in the introduction,""" start="00:20:43.860" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we can use the macro replacement syntax,""" start="00:20:45.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which is three curly braces,""" start="00:20:47.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""followed by the macro name and any arguments,""" start="00:20:49.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then three ending curly braces.""" start="00:20:52.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""You see why I kept the macro name short.""" start="00:20:55.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""That's six curly braces in total we're typing,""" start="00:20:58.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which still takes up a fair amount of space.""" start="00:21:01.280" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Now let's take a look at how we might use""" start="00:21:05.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""these properties in practice.""" start="00:21:07.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Debian and RedHat distros differ""" start="00:21:09.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on how they install packages.""" start="00:21:11.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So we're gonna want an &quot;install&quot; property,""" start="00:21:12.930" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""where in Debian we use `sudo apt-get install -qq`,""" start="00:21:16.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and on RedHat we'll use something like""" start="00:21:24.580" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""`sudo dnf install -y`.""" start="00:21:26.940" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now development packages""" start="00:21:33.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""also have a different naming convention.""" start="00:21:35.330" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""For example, the `ncurses` library on Debian""" start="00:21:38.050" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""is called `libncurses-dev`,""" start="00:21:40.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""where on RedHat it's called `ncurses-devel`.""" start="00:21:43.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""There are likely going to be""" start="00:21:48.260" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""many more little differences like this""" start="00:21:49.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that we'll need to solve with properties.""" start="00:21:52.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now I already don't like where this is going.""" start="00:21:55.340" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Switching between the Debian and RedHat""" start="00:21:58.610" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""versions of the document is gonna mean""" start="00:22:00.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""commenting and uncommenting out""" start="00:22:03.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""a bunch of different properties,""" start="00:22:05.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which is pretty janky.""" start="00:22:06.990" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Luckily we can solve this problem""" start="00:22:09.020" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""with a little bit of Emacs Lisp.""" start="00:22:11.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll start by modifying our properties,""" start="00:22:14.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""so their property names are prefixed""" start="00:22:16.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""with either `deb_` or `rh_`""" start="00:22:19.141" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to signify which distro the property applies to.`""" start="00:22:23.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll also create a single property called &quot;prefix&quot;,""" start="00:22:27.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which will be prepended to the property name""" start="00:22:31.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""by the `get_prop` function""" start="00:22:34.590" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""if the requested property is not found.""" start="00:22:36.530" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This way, when we want to switch between""" start="00:22:39.510" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the Debian and RedHat versions of the document,""" start="00:22:42.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we just need to change the prefix property.""" start="00:22:45.350" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So now we'll change the Elisp code.""" start="00:22:49.030" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So we'll use a let expression with two bound variables.""" start="00:22:51.380" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The first one is called ret,""" start="00:22:55.210" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which determines if the initial call""" start="00:22:56.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to `org-property-values` succeeds.""" start="00:22:59.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The second variable is called prefix,""" start="00:23:01.950" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which is the prefix property.""" start="00:23:04.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If the first call to `org-property-values` succeeds,""" start="00:23:06.220" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we return it as normal.""" start="00:23:09.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If not, we concatenate the property value""" start="00:23:11.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that was passed into the function""" start="00:23:14.250" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""onto the prefix and try again.""" start="00:23:15.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now when we call the `get_prop` function with &quot;distro&quot;""" start="00:23:18.970" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""as the prop argument, it won't be found.""" start="00:23:23.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So the code will slap our prefix tag on the front,""" start="00:23:26.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""making it something like `rh_distro`,""" start="00:23:29.690" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and it will be found and returned.""" start="00:23:33.250" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Let's see that in action.""" start="00:23:35.330" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""All right, now we're talking.""" start="00:23:40.000" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""This setup is starting to look pretty good,""" start="00:23:42.010" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but there are just a few things""" start="00:23:44.420" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that I want to add before we move on.""" start="00:23:46.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""First of all, I think the document should have a subtitle,""" start="00:23:48.660" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""something that tells you if you're looking at the RedHat""" start="00:23:51.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""or the Debian version of the document.""" start="00:23:53.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I also think it would be great""" start="00:23:56.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""if the file name of the exported document""" start="00:23:57.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""reflected the distribution as well.""" start="00:24:00.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I also want to add a quick Debian only section""" start="00:24:05.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to the document that explains how it got its name.""" start="00:24:08.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now let's see what happens when we export the document.""" start="00:24:11.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This did not work out as we wanted.""" start="00:24:17.740" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""As you can see, the macro we used in the subtitles""" start="00:24:20.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""didn't expand properly,""" start="00:24:23.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and as a result, our subtitle didn't render right.""" start="00:24:24.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Sadly, you can't use macros""" start="00:24:28.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""or inline function calls everywhere.""" start="00:24:30.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And one place where they don't work""" start="00:24:32.910" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""is inside of certain export keywords.""" start="00:24:34.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So we're gonna have to hard code them here.""" start="00:24:37.190" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Another mistake that we made is we forgot to update""" start="00:24:43.220" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the `#+EXCLUDE_TAGS` export keyword,""" start="00:24:46.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because with the RedHat version of the document,""" start="00:24:49.100" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we want to exclude the Debian tag.""" start="00:24:51.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now when we export the document,""" start="00:24:54.510" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""everything should be correct.""" start="00:24:56.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The word RedHat should appear in the subtitle,""" start="00:24:57.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and the Debian fun fact section should not be present.""" start="00:25:00.620" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now we just need to add a section to the README""" start="00:25:04.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that explains the steps you need to take""" start="00:25:06.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in order to switch the document""" start="00:25:09.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""from RedHat to Debian.""" start="00:25:11.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Okay, let's see here.""" start="00:25:12.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We have to change `#+SUBTITLE`, change the `#+EXCLUDE_TAGS`,""" start="00:25:14.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""change the `#+EXPORT_FILE_NAME`,""" start="00:25:18.310" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and change the `prefix` property.""" start="00:25:20.430" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This is OK, but it's not great.""" start="00:25:23.290" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Emacs Lisp can once again come to our rescue.""" start="00:25:26.290" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""What we'll do is make an Elisp code block""" start="00:25:29.430" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that will invite the user to hit `C-c C-c` on.""" start="00:25:32.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And the code block will essentially make all these changes""" start="00:25:35.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in the document for them.""" start="00:25:39.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This code block, which we'll call `switch_distro`,""" start="00:25:40.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""takes one argument called `os`,""" start="00:25:43.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which by default is set to &quot;Debian&quot;.""" start="00:25:45.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""It starts out with a let expression""" start="00:25:48.690" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that defines three bound variables.""" start="00:25:50.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The `debian` variable is a boolean that is true""" start="00:25:53.030" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""if the distro we're switching to is Debian.""" start="00:25:55.970" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Based on the value of this boolean,""" start="00:25:58.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we'll set the `noexport` and `prefix` variables accordingly.""" start="00:26:00.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The `save-excursion` block tells Emacs""" start="00:26:04.170" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that we're going to be moving around in the document""" start="00:26:06.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and to remember to put our point back where we started""" start="00:26:09.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""when the block finishes.""" start="00:26:11.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""After that, we essentially go to the top of the document""" start="00:26:13.430" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and search and replace the subtitle, `exclude_tags`,""" start="00:26:16.250" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""`export_file_name`, and the `prefix`.""" start="00:26:19.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Pretty cool.""" start="00:26:22.500" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Let's see this in action.""" start="00:26:23.390" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If we hit `C-c C-c` on this block,""" start="00:26:25.030" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we should see the document automatically change a bit.""" start="00:26:27.870" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And now when we export it,""" start="00:26:30.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we get the Debian version of the doc.""" start="00:26:32.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If we want to change it back,""" start="00:26:36.090" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we can just head back over to the code block""" start="00:26:37.630" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and change the default value for the os variable""" start="00:26:39.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""from &quot;Debian&quot; to &quot;RedHat&quot; and hit `C-c C-c` again.""" start="00:26:43.150" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And now when we re-export,""" start="00:26:47.620" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we're looking at the RedHat version of the document.""" start="00:26:49.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Just as an aside, if you ever thought to yourself,""" start="00:26:52.910" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""&quot;I should learn Emacs Lisp someday&quot;""" start="00:26:55.860" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Make it someday soon. You'll be happy you did.""" start="00:26:58.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Not only is it a fun programming language,""" start="00:27:01.290" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but you can do powerful things with it in Emacs,""" start="00:27:03.770" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which I hope is a point that folks take away from this talk.""" start="00:27:06.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""All right, that was a lot.""" start="00:27:12.150" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Now that we've spent the past 20 minutes or so""" start="00:27:14.150" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""digging into some of the tips and tricks I used""" start="00:27:16.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""when creating my build Emacs from source document,""" start="00:27:19.410" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we'll say goodbye to this document we've been working on""" start="00:27:22.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and we'll start a tour""" start="00:27:26.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of the actual literate document I wrote.""" start="00:27:27.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""A document that I'll demonstrate actually downloading""" start="00:27:29.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and building a new Emacs when I export it""" start="00:27:33.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on both my Ubuntu and RedHat virtual machines.""" start="00:27:35.660" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I'll also show you how org-mode can generate""" start="00:27:38.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""slick professional looking PDF files""" start="00:27:41.690" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""through the power of LaTeX.""" start="00:27:44.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll start here at the orgdemo2 directory,""" start="00:27:46.580" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which I've cloned from GitLab.""" start="00:27:49.620" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This repository has all the source materials for this talk.""" start="00:27:51.230" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The buildemacs.org file is where most of the good stuff is.""" start="00:27:55.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So that's where we'll start.""" start="00:27:59.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""There's a lot of file-local variables""" start="00:28:01.480" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that we'll need to confirm.""" start="00:28:03.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So we'll do that too.""" start="00:28:04.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So the first thing we're gonna do""" start="00:28:06.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""is hit `C-u TAB` twice,""" start="00:28:07.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which will give us a top-level overview""" start="00:28:10.780" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of all of our headings.""" start="00:28:13.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""As you can see, we've got a lot""" start="00:28:15.140" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of the same familiar export keywords we had before.""" start="00:28:16.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""`#+TITLE`, `#+SUBTITLE`, `#+AUTHOR`, `#+EMAIL`,""" start="00:28:20.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""plus a few we haven't seen before.""" start="00:28:23.100" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""For example, I've squirreled away""" start="00:28:25.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""a lot of the `#+LATEX_HEADER` export keywords""" start="00:28:27.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in this file called latex.setup.""" start="00:28:30.620" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And I did this just so they don't clutter up the document.""" start="00:28:33.540" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Much of the LaTeX magic""" start="00:28:36.540" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that makes the exported document look good""" start="00:28:38.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""is in these headers.""" start="00:28:40.910" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""LaTeX commands begin with a backslash.""" start="00:28:42.590" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And a common one we use a lot here is `\usepackage`.""" start="00:28:45.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This lets us bring in packages like geometry,""" start="00:28:49.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""svg for the cool SeaGL SVG logo,""" start="00:28:52.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""`fancyhdr` and fancy verbatim [`fancyvrb`]""" start="00:28:56.540" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to keep things looking pretty fancy.""" start="00:28:58.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Using a scalable vector image format""" start="00:29:00.690" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""makes it possible for us to do really cool things""" start="00:29:03.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""like having a scaled-down version of the SeaGL logo""" start="00:29:05.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""appear in the fancy footer below.""" start="00:29:09.270" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I also include some macros in a separate file""" start="00:29:11.980" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""just to help keep things tidy in the main document.""" start="00:29:15.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Here I've got the familiar macros""" start="00:29:18.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we've seen before for `get_prop`.""" start="00:29:20.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""But here I use different permutations""" start="00:29:23.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""depending on if I want results raw""" start="00:29:25.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""or raw verbatim or just verbatim.""" start="00:29:28.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I also have a couple of macros here at the top of the file""" start="00:29:31.870" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that are for pulling strings out of results blocks""" start="00:29:35.070" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then trimming them""" start="00:29:40.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""so there's no white space on either side.""" start="00:29:41.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Like in the version of the document""" start="00:29:44.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we worked on at the start of this talk,""" start="00:29:46.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the real document also has a README section""" start="00:29:48.430" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""marked with the `:noexport:` tag.""" start="00:29:51.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""It also has a section about choosing""" start="00:29:53.470" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which version of the document to export""" start="00:29:55.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and a code block on how to switch between them.""" start="00:29:57.910" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""It's also got a lot of helpful information in it""" start="00:30:00.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""like what OS and Emacs versions""" start="00:30:03.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the document has been tested to &quot;run&quot; on,""" start="00:30:05.820" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""a section on the LaTeX prerequisites""" start="00:30:09.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and the section on executing""" start="00:30:12.330" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the document's various code blocks.""" start="00:30:14.080" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""The latter two sections we'll take a look at now.""" start="00:30:16.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Out of the box on Fedora and Ubuntu server distros,""" start="00:30:19.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the TeX typesetting system""" start="00:30:22.580" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""also by noted computer scientist Donald Knuth""" start="00:30:24.710" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""is not installed.""" start="00:30:27.670" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So we'll need to install some packages.""" start="00:30:28.860" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Starting out we'll need the `texlive` package""" start="00:30:31.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which gets you a fully featured TeX setup.""" start="00:30:34.450" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This also gets you LaTeX""" start="00:30:37.460" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which can be viewed as a distribution of TeX macros.""" start="00:30:39.290" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""You'll also need XeTeX.""" start="00:30:42.790" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This gets you Unicode support and lets you use modern fonts.""" start="00:30:44.900" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll also want to install pdfTeX.""" start="00:30:49.780" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This gets us the ability to generate PDFs from TeX sources.""" start="00:30:52.810" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And finally, we're gonna need to install latexmk""" start="00:30:57.210" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which is a Perl script""" start="00:31:01.300" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that knows how to run LaTeX multiple times""" start="00:31:02.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in order to properly deal with intra-document links.""" start="00:31:05.140" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""But wait, there's more.""" start="00:31:09.250" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We're also gonna need Inkscape""" start="00:31:11.070" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to rasterize our SeaGL vector logo""" start="00:31:12.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""at different resolutions.""" start="00:31:15.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And we're gonna need the JetBrains Mono font""" start="00:31:17.340" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to make our source code look snazzy.""" start="00:31:20.360" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll also need the Inter font""" start="00:31:23.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to make our prose look snazzy as well.""" start="00:31:24.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I've helpfully added a bash code block in the README""" start="00:31:28.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that you can hit C-c C-c on to install.""" start="00:31:31.300" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This really does lock up Emacs for a few minutes""" start="00:31:35.740" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and it's sort of annoying.""" start="00:31:38.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""When we export the document and turn off all caching""" start="00:31:40.330" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and it actually builds Emacs for real,""" start="00:31:43.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Emacs can be locked up for tens of minutes.""" start="00:31:45.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""There's a package called ob-async""" start="00:31:48.770" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that I've been meaning to check out that might help here.""" start="00:31:50.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""But since I wanted this document""" start="00:31:54.260" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to work on bog-standard Emacs setups,""" start="00:31:55.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I didn't get around to it.""" start="00:31:58.000" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Before we get into talking about running the document,""" start="00:32:00.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""let's talk briefly about results caching.""" start="00:32:03.140" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll take a look at the section of the document""" start="00:32:06.450" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""where we talk about Git tags for an example.""" start="00:32:08.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The `num_tags` bash code block determines""" start="00:32:13.140" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""how many tags there are in the Emacs Git repo.""" start="00:32:15.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And when I hit C-c C-c on that block""" start="00:32:19.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""several days ago, when I was first creating the document,""" start="00:32:21.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that number was 183.""" start="00:32:25.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""That result has remained cached in the document since then.""" start="00:32:28.020" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And you can see a snippet of the SHA1 hash""" start="00:32:32.170" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of the contents of the source block below.""" start="00:32:34.900" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""You can see where I referenced the result""" start="00:32:38.390" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""using the `sr` for string raw macro in the prose below,""" start="00:32:40.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and how it gets rendered in the exported PDF document.""" start="00:32:44.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""All the source blocks in the exported sections""" start="00:32:50.510" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""of the document include cached results like this.""" start="00:32:52.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If I export the document now, it won't take that long to do""" start="00:32:56.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because while there are a ton of code blocks""" start="00:33:01.390" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in the exported sections, they're all cached.""" start="00:33:03.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now let's get back to the section of the README""" start="00:33:09.070" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that explains how to execute the code in the document.""" start="00:33:11.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Here I explain that if you want to build Emacs""" start="00:33:14.910" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on your computer using this document,""" start="00:33:17.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you've got a couple of options.""" start="00:33:20.190" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The first option is to manually invalidate the caches""" start="00:33:22.020" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and take C-c C-c on every code block""" start="00:33:25.650" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in the main document.""" start="00:33:28.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This lets you supervise the entire process,""" start="00:33:30.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and it also creates new cached result blocks,""" start="00:33:33.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but it's time consuming.""" start="00:33:36.940" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""There is also an internal link to the main document here,""" start="00:33:39.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and you can jump to it with C-c C-o.""" start="00:33:43.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This is one of those intra-document links""" start="00:33:47.380" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that is really tricky to get right with LaTeX,""" start="00:33:50.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and is why we opted to use the latexmk Perl script""" start="00:33:53.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to build the PDF version of the document.""" start="00:33:56.990" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I'm mentioning it specifically here""" start="00:34:00.050" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because it took me forever to figure this out.""" start="00:34:01.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The second option you've got""" start="00:34:05.630" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""is to change the default header arg""" start="00:34:07.270" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""from `:cache yes` to `:cache no` at the top of the document.""" start="00:34:09.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If we cruise up to the top of the document,""" start="00:34:13.740" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you can see that this header argument property""" start="00:34:16.270" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""basically says that unless a code block""" start="00:34:19.130" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""explicitly says otherwise,""" start="00:34:22.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""it's by default supposed to be cached.""" start="00:34:24.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""That's how we were able to export the document""" start="00:34:27.119" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""before so quickly.""" start="00:34:29.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""The code block named `no_cache_no_confirm`""" start="00:34:31.559" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""uses the `save-excursion` and regex replace trick""" start="00:34:34.820" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that I demonstrated earlier""" start="00:34:38.619" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to munch the default cache header arg""" start="00:34:40.349" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""from &quot;cache yes&quot; to &quot;cache no&quot;.""" start="00:34:42.820" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And it also turns off confirmations on bash code blocks.""" start="00:34:45.410" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Let's do that now.""" start="00:34:49.300" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now we'll export the document to PDF,""" start="00:34:51.940" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""which will ignore the cache result blocks""" start="00:34:54.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and clone the Git repository on Savannah,""" start="00:34:57.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""create a branch that points""" start="00:35:00.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to the most recently tagged version of Emacs 29,""" start="00:35:01.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""run configure a handful of times,""" start="00:35:05.460" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""installing packages to fix missing dependencies""" start="00:35:07.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""along the way,""" start="00:35:10.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""build Emacs, install Emacs in our home directory,""" start="00:35:12.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""verify that it has successfully built a binary,""" start="00:35:16.100" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""run it in batch mode with some sample Elisp""" start="00:35:19.340" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and show the file sizes and dates of the generated files.""" start="00:35:22.550" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This is gonna take a while.""" start="00:35:26.870" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And while it's running, we'll pop over to our Fedora box.""" start="00:35:28.340" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""All right, now we'll fire up Emacs,""" start="00:35:32.830" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""hit `C-c C-c` on the `configure_document` code block""" start="00:35:34.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to configure the document for RedHat""" start="00:35:39.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""since Fedora here is a RedHat based distro.""" start="00:35:41.850" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Then what we'll do is we'll pop down""" start="00:35:45.710" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and hit `C-c C-c`""" start="00:35:47.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on the `rh_install_latex` code block""" start="00:35:49.590" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to install the LaTeX prerequisites""" start="00:35:53.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""for this Fedora virtual machine.""" start="00:35:56.230" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Finally, we'll execute the `no_cache_no_confirm` block""" start="00:35:58.460" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then kick off the export.""" start="00:36:02.590" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Then we'll go and check back on what's happening""" start="00:36:05.050" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on the Ubuntu box.""" start="00:36:07.280" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Ooh, top looks pretty quiet.""" start="00:36:09.530" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I think the export is complete.""" start="00:36:11.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Ooh, those are the words I love to see in the status area,""" start="00:36:14.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""PDF file produced!""" start="00:36:17.560" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Now I can't use my web browser""" start="00:36:20.610" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to take a look at this PDF file""" start="00:36:22.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because I haven't set up a web server""" start="00:36:24.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""or anything like that on the Ubuntu virtual machine.""" start="00:36:27.080" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I can, however, use TRAMP with the ssh method""" start="00:36:30.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to poke around on the ubuntu host""" start="00:36:34.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""on my personal version of Emacs.""" start="00:36:36.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So let's do that.""" start="00:36:39.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Okay, so now if we go into the source directory""" start="00:36:40.940" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then we hop into the orgdemo2 directory""" start="00:36:44.810" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then we look at the deb version of the PDF,""" start="00:36:48.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""there she blows.""" start="00:36:51.620" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now, if we go down to the Building Emacs section,""" start="00:36:54.150" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we can see that it built.""" start="00:36:58.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And if we look in the bin directory,""" start="00:37:00.130" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we can see that at 17:01,""" start="00:37:03.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that's when all of those files got created.""" start="00:37:06.780" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Also the file creation date on the PDF is 17:01.""" start="00:37:11.380" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So all of this code executed roughly the same time""" start="00:37:15.590" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the PDF was created.""" start="00:37:18.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""All right, so now let's head back over to the Fedora box""" start="00:37:21.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then we'll navigate to the source directory,""" start="00:37:25.340" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""the orgdemo2 directory,""" start="00:37:27.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and there is our RedHat version of the built Emacs PDF.""" start="00:37:30.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And Bob's your uncle.""" start="00:37:35.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And you can see it is the RedHat version of the document""" start="00:37:38.220" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because this is a RedHat box.""" start="00:37:42.550" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And if we go over to the What did we install? section,""" start="00:37:44.940" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you can see that these binaries were built at 17:35.""" start="00:37:51.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And now if we pop open dired""" start="00:37:56.050" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and we take a look at the PDF,""" start="00:37:58.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we can see it also was created at 17:35.""" start="00:38:00.740" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""All right, in the couple minutes remaining,""" start="00:38:07.330" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I thought it would be a good idea""" start="00:38:10.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""just to take a look at the document""" start="00:38:11.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and maybe just go through some of what it actually does""" start="00:38:15.740" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""in explaining how to build Emacs from source.""" start="00:38:19.000" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We'll look at the RedHat version since we're here.""" start="00:38:22.580" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And the first thing you do is""" start="00:38:27.140" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you have to get access to the source code.""" start="00:38:28.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And before you can do anything,""" start="00:38:31.540" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""this is a RedHat-specific section""" start="00:38:32.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""where you need to install some development tools.""" start="00:38:35.420" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And this development tools group actually has Git.""" start="00:38:38.300" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Now I installed Git earlier, but if you didn't do that,""" start="00:38:41.540" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that would be the first thing that you need to do.""" start="00:38:44.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We create a source directory, we cd into it,""" start="00:38:46.940" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we clone the repo from Savannah.""" start="00:38:50.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then we start to take a look at some of the Git tags.""" start="00:38:53.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And we showed this before where we check out""" start="00:38:56.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""how many different tags there are.""" start="00:38:58.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then we run this kind of funky Git command""" start="00:39:00.370" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to sort of list all the tags that begin with 'emacs-29',""" start="00:39:02.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and we sort them by when they were tagged.""" start="00:39:06.040" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So we can see that Emacs 29.1.pretest""" start="00:39:08.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""is the most recent version.""" start="00:39:12.400" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So that's the one we grab""" start="00:39:14.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and that's the one we decide to build.""" start="00:39:15.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then we create a branch that is based on this tag.""" start="00:39:18.660" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And this is dynamically generated based on what we saw here.""" start="00:39:22.780" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So that's what we use here.""" start="00:39:27.480" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""In this case, we're piping standard error""" start="00:39:29.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to where standard out goes.""" start="00:39:32.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""That's another trick.""" start="00:39:35.100" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""If you want to actually see an error get created,""" start="00:39:36.070" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""org-mode will capture any errors that code blocks produce,""" start="00:39:39.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and it will show you the error message in a buffer.""" start="00:39:44.120" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So if you actually wanna show what it looks like""" start="00:39:46.820" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""when something errors out, this is the trick you have to use.""" start="00:39:49.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then what we do is we look for a configure script""" start="00:39:53.060" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and there isn't one.""" start="00:39:56.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then we realize,""" start="00:39:57.420" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""uh-oh, we're gonna have to deal with autotools.""" start="00:39:58.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So, you know, we run the autogen script and it complains""" start="00:40:00.910" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because we're missing some prerequisites.""" start="00:40:05.560" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So we have to install autoconf,""" start="00:40:08.680" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then we run it again,""" start="00:40:11.350" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and finally it generates a configure script.""" start="00:40:13.020" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And this is another case where I pull this number""" start="00:40:15.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""right here into the actual prose.""" start="00:40:19.020" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And I can see it's, oh, it's, you know, this how many bytes.""" start="00:40:21.980" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""When was the last time you wrote a shell script""" start="00:40:24.840" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that was this many bytes long?""" start="00:40:26.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then we configure the build process.""" start="00:40:29.580" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And, you know, it's not gonna work right away""" start="00:40:31.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""because we don't have GNU Texinfo installed.""" start="00:40:33.760" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So we gotta do that, which we do with `dnf install` here.""" start="00:40:36.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then there's this section that is either RedHat-""" start="00:40:41.440" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""or Debian-specific that talks about, like,""" start="00:40:44.320" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""if you don't know the name of a package""" start="00:40:48.920" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that contains a given file name, how do you query it?""" start="00:40:51.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And in the RedHat world, you use `dnf provides makeinfo`.""" start="00:40:55.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""In the Debian world, you do something entirely different.""" start="00:40:59.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then we have to install the `ncurses` binary.""" start="00:41:02.290" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And finally we get like a minimal configuration""" start="00:41:06.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and you can see that there's a whole bunch of nos here.""" start="00:41:10.300" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So, you know, we don't have cairo,""" start="00:41:13.700" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""we don't have imagemagick, we don't have dbus,""" start="00:41:15.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""you know, there's a whole bunch of stuff we don't have.""" start="00:41:18.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""We don't have X, we don't have libjansson, no tree-sitter.""" start="00:41:20.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This is really a bare-bones Emacs""" start="00:41:23.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""that is strictly terminal mode.""" start="00:41:25.960" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Then we actually build Emacs, which is, you know,""" start="00:41:28.640" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""kind of boring, we're just gonna type make""" start="00:41:30.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then make is gonna run successfully.""" start="00:41:33.260" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And make is gonna spew a ton of output, right?""" start="00:41:35.260" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""So here's where I do that /dev/null trick,""" start="00:41:37.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""where I pipe everything to /dev/null""" start="00:41:41.100" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then I, or I pipe standard output to /dev/null""" start="00:41:42.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and then I pipe standard error""" start="00:41:45.820" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""to wherever standard output's going.""" start="00:41:47.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then at the end to say that it ran successfully,""" start="00:41:50.240" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I say &quot;Make ran successfully!&quot;""" start="00:41:52.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Then we take a look at the Emacs binary""" start="00:41:55.380" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and you know, it's an elf binary.""" start="00:41:57.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And, you know, because this is running on my Mac,""" start="00:41:59.880" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""this is an ARM-based machine, this virtual machine is.""" start="00:42:01.720" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""Oops, and this is a bug.""" start="00:42:06.620" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""This really should be a macro call,""" start="00:42:10.520" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""but I think I have the wrong number of curly braces""" start="00:42:12.200" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""or something in there.""" start="00:42:14.800" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I need to figure out why that's not right.""" start="00:42:16.160" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""I'll look into that later.""" start="00:42:19.130" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then we install Emacs and then we kind of show""" start="00:42:21.110" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""like the file sizes of everything in the home directory.""" start="00:42:23.980" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And then we, you know, show the binaries that got installed.""" start="00:42:27.720" video="mainVideo-doc" id="subtitle"]]
+[[!template new="1" text="""Anyway, so this is the final thoughts section.""" start="00:42:31.990" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And my final thoughts are, is I hope you enjoyed this talk""" start="00:42:35.600" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""and I hope you actually learned a thing or two.""" start="00:42:39.220" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""All right, thanks everybody.""" start="00:42:42.380" video="mainVideo-doc" id="subtitle"]]
+[[!template text="""And I'll see you all next time.""" start="00:42:43.360" video="mainVideo-doc" id="subtitle"]]
+
+
+
+Captioner: jc
+
Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20doc%3A%20Literate%20Documentation%20with%20Emacs%20and%20Org%20Mode)
diff --git a/2023/info/doc-before.md b/2023/info/doc-before.md
index 3943fad8..7a3eafb6 100644
--- a/2023/info/doc-before.md
+++ b/2023/info/doc-before.md
@@ -10,12 +10,37 @@ The following image shows where the talk is in the schedule for Sat 2023-12-02.
Format: 43-min talk; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2023/current/bbb-doc.html>
Etherpad: <https://pad.emacsconf.org/2023-doc>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Ready to stream
-<div>Times in different timezones:</div><div class="times" start="2023-12-02T20:10:00Z" end="2023-12-02T20:50:00Z"><div class="conf-time">Saturday, Dec 2 2023, ~3:10 PM - 3:50 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 2 2023, ~2:10 PM - 2:50 PM CST (US/Central)<br />Saturday, Dec 2 2023, ~1:10 PM - 1:50 PM MST (US/Mountain)<br />Saturday, Dec 2 2023, ~12:10 PM - 12:50 PM PST (US/Pacific)<br />Saturday, Dec 2 2023, ~8:10 PM - 8:50 PM UTC <br />Saturday, Dec 2 2023, ~9:10 PM - 9:50 PM CET (Europe/Paris)<br />Saturday, Dec 2 2023, ~10:10 PM - 10:50 PM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~1:40 AM - 2:20 AM IST (Asia/Kolkata)<br />Sunday, Dec 3 2023, ~4:10 AM - 4:50 AM +08 (Asia/Singapore)<br />Sunday, Dec 3 2023, ~5:10 AM - 5:50 AM JST (Asia/Tokyo)</div></div><div><a href="/2023/watch/dev/">Find out how to watch and participate</a></div>
-
-
-
-
-
+Status: All done
+
+
+
+
+
+<div class="vid"><video controls preload="none" id="doc-mainVideo"><source src="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2023/captions/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2023/captions/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="doc-mainVideo" data="""
+00:00.000 Introduction
+00:57.760 Org Babel and literate programming
+02:14.080 This presentation
+04:53.480 Getting started
+06:55.780 README
+07:23.500 Writing a code block
+08:10.460 :results none
+08:40.320 Confirmation
+10:36.960 Running blocks automatically
+13:53.000 Export options
+16:05.700 Substituting constants
+17:25.740 Getting the properties
+20:03.060 Macros
+21:05.240 Properties in practice
+22:09.020 Using a prefix
+23:42.010 Switching distributions
+27:14.150 A tour
+30:16.200 TeX and LaTeX
+31:09.250 Other prerequisites
+32:00.060 Caching
+36:20.610 Looking at the PDF
+39:29.440 Errors
+42:31.990 Final thoughts
+
+"""]]<div></div>Duration: 42:45 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2023-doc">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2023/current/bbb-doc.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--final.webm">Download --final.webm (133MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main.opus">Download --main.opus (23MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main.txt">Download --main.txt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--main.webm">Download --main.webm (133MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--normalized.opus">Download --normalized.opus (37MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--original.mp4">Download --original.mp4 (119MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-doc--literate-documentation-with-emacs-and-org-mode--mike-hamrick--reencoded.webm">Download --reencoded.webm (119MB)</a></li><li><a href="https://toobnix.org/w/8ak16Qy1tjeFEqmcnan6MQ">View on Toobnix</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2023/info/ref-after.md b/2023/info/ref-after.md
index 9a823b5f..385975af 100644
--- a/2023/info/ref-after.md
+++ b/2023/info/ref-after.md
@@ -1,6 +1,279 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="ref-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello, this is Christopher Howard,""" start="00:00:00.000" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and welcome to my talk,""" start="00:00:04.940" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""&quot;Informal Reference Tracking.&quot;""" start="00:00:06.520" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""This is a workflow talk,""" start="00:00:08.800" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""so I need to explain a little bit about""" start="00:00:10.574" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""what my needs were.""" start="00:00:12.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I am not a professional scholar or academic,""" start="00:00:14.840" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""but there are a number of subjects""" start="00:00:18.760" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that I'm interested in,""" start="00:00:20.200" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and I occasionally like to write""" start="00:00:21.607" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""gemlog posts about them.""" start="00:00:23.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So I needed some way to keep track of references.""" start="00:00:25.600" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""References to webpage articles, references to books,""" start="00:00:28.680" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""pages in books, and notes about them.""" start="00:00:32.960" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Something that was searchable,""" start="00:00:37.280" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""but also something that was quick and easy to use,""" start="00:00:39.480" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and something that I could set up quickly.""" start="00:00:42.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And the approach I took, it only took me""" start="00:00:45.200" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""about an hour or two to figure out""" start="00:00:47.360" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""how to put it together.""" start="00:00:49.520" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I do want to emphasize""" start="00:00:52.160" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that there are better ways to do this.""" start="00:00:53.840" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I'm not recommending you use my code""" start="00:00:56.520" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""or follow my exact approach.""" start="00:00:58.960" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""In particular, what I'm doing was meant to be done""" start="00:01:02.120" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""with Org's built-in capture""" start="00:01:05.940" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and templates functionality,""" start="00:01:09.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""so that's something that's more flexible,""" start="00:01:11.800" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""programmable, and there's also a lot of add-ins""" start="00:01:14.907" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that can be tied into that.""" start="00:01:21.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""For example, tools that allow you to search for,""" start="00:01:23.960" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""you know, feed in a URL, and it automatically""" start="00:01:31.320" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""pulls all the reference data for you.""" start="00:01:34.480" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And there's tools out there""" start="00:01:38.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that are really meant for scientific writing,""" start="00:01:39.760" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""so if you do this professionally,""" start="00:01:43.120" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""you may need to keep track of dozens of details""" start="00:01:46.760" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""for each reference""" start="00:01:49.960" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and then have some fancy system to generate that""" start="00:01:51.080" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""into your, or output that into your paper.""" start="00:01:55.320" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So there are better systems,""" start="00:02:00.800" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""but this is what worked for me and what was easy.""" start="00:02:02.440" video="mainVideo-ref" id="subtitle"]]
+[[!template new="1" text="""I do want to emphasize that if you haven't,""" start="00:02:06.040" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""you really want to learn how to use helm-mode""" start="00:02:11.320" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""H-E-L-M, or one of the similar systems in Emacs""" start="00:02:14.640" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that does fuzzy search on Emacs commands.""" start="00:02:20.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""For example, in Helm here,""" start="00:02:26.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I input one keychord, and then I just have to remember""" start="00:02:29.340" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""a few characters of some command,""" start="00:02:39.007" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and they don't even have to be right next to each other,""" start="00:02:40.720" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""like H-O-C will bring up `helm-occur`.""" start="00:02:43.480" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""That's based on its algorithms""" start="00:02:47.640" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""of what I most likely meant""" start="00:02:51.360" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and the ones that I've used in the past.""" start="00:02:53.000" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So it usually brings up the command that I want,""" start="00:02:55.160" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""or the one that I want""" start="00:02:57.920" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""is one or two spots away in the entry.""" start="00:02:59.580" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""That just saves me a lot of time""" start="00:03:03.080" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""[and] a lot of memorization.""" start="00:03:05.074" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So if you haven't learned Helm""" start="00:03:06.960" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""or a similar system for Emacs, you really want to.""" start="00:03:09.120" video="mainVideo-ref" id="subtitle"]]
+[[!template new="1" text="""So what is my approach?""" start="00:03:14.920" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Well, basically, what it comes down to is really""" start="00:03:18.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""fundamentally nothing more than just a list""" start="00:03:24.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""of Org entries in a file.""" start="00:03:27.307" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And there's one entry per reference.""" start="00:03:30.640" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Fundamentally, that's all it is.""" start="00:03:35.580" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""But I'll go over the parts.""" start="00:03:37.207" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""You can see there's the title for the entry,""" start="00:03:39.207" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and that's not necessarily""" start="00:03:43.080" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""the title of the book or the article,""" start="00:03:44.800" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""but that's my perspective on it,""" start="00:03:47.400" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that's what I want to remember about it,""" start="00:03:50.840" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and what I'll be looking for later""" start="00:03:52.720" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""when I do a search on my references.""" start="00:03:54.560" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""There's also in here the use of Org's tags""" start="00:03:56.560" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""here to the right of the title,""" start="00:04:06.660" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""very handy for searching for entries later.""" start="00:04:08.274" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I use some Org properties attached to each entry.""" start="00:04:12.040" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I automatically add in here an ID""" start="00:04:18.160" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that can be useful if you want to""" start="00:04:21.740" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""link entries together later.""" start="00:04:24.074" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I automatically add in here the date""" start="00:04:27.800" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that the entry was created,""" start="00:04:30.400" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""which can be useful to me if things""" start="00:04:31.840" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""got sorted in a different order at some point,""" start="00:04:35.700" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I could still look through""" start="00:04:38.360" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""the most recent entries that I had made""" start="00:04:39.940" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""if I wanted to do that for some reason.""" start="00:04:42.507" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And sometimes I add in this publication year field""" start="00:04:45.040" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""with the idea that one day I might want to do""" start="00:04:48.640" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""a search for entries based on the publication year""" start="00:04:52.720" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""of the book or the article,""" start="00:04:55.840" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""say, only to use recent references""" start="00:04:57.360" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""or something like that.""" start="00:05:00.774" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And then down here below the properties""" start="00:05:03.080" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""is where I paste in the URL to the webpage, or""" start="00:05:05.360" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""type in the title and author of the book""" start="00:05:10.080" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""on the pages, maybe the pages that were relevant,""" start="00:05:13.007" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""the pages of the periodical, or something like that.""" start="00:05:16.960" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And I could put anything that I want down here,""" start="00:05:21.640" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""some other notes about what's important""" start="00:05:23.920" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""about this article to me.""" start="00:05:25.840" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So fundamentally, that's all it is.""" start="00:05:29.940" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Of course, I've added in a bit of convenience code""" start="00:05:32.200" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""to make this go a lot faster""" start="00:05:35.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""rather than typing all this out.""" start="00:05:37.080" video="mainVideo-ref" id="subtitle"]]
+[[!template new="1" text="""For that, I'll switch back to my init.el file.""" start="00:05:39.320" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""There's really just five functions.""" start="00:05:45.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""The first two here are ones""" start="00:05:49.480" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that I've adapted off the Internet.""" start="00:05:52.840" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Honestly, I can't remember""" start="00:05:54.560" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""exactly where that I got them from,""" start="00:05:56.160" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""but basically, they're just some functions""" start="00:05:58.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""for making a block of text writable or readable.""" start="00:06:00.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Writable or not writable, I should say.""" start="00:06:04.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""The idea there is that""" start="00:06:09.300" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""when I'm creating a new entry,""" start="00:06:12.200" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I don't want to accidentally delete""" start="00:06:13.480" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""or write over some earlier entries that I've made.""" start="00:06:16.307" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So I use a little bit of Emacs functionality for that.""" start="00:06:18.960" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And then here are the three reference functions""" start="00:06:24.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that I've actually written.""" start="00:06:29.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Really trivial, basic stuff here.""" start="00:06:32.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""The core of it is the `new-reference` function.""" start="00:06:35.040" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Basically, what that does is""" start="00:06:41.800" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""it opens up the references file,""" start="00:06:44.840" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""jumps to the end of the reference file,""" start="00:06:47.560" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""starts a new entry, inserts the asterisk.""" start="00:06:52.040" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""It jumps back to the previous text,""" start="00:06:57.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and whatever previous text there is,""" start="00:07:01.520" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""it makes that read-only.""" start="00:07:03.474" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Again, so that I don't accidentally delete that,""" start="00:07:04.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""or cut, or type over it, or something""" start="00:07:08.120" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""when I'm making a new reference.""" start="00:07:10.800" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Then it goes back to the new reference,""" start="00:07:14.580" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""automatically adds in a unique ID for that,""" start="00:07:17.680" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and then automatically stamps it with""" start="00:07:21.340" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""the date the entry was created — today's date.""" start="00:07:25.360" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Now, I've got two other functions here.""" start="00:07:29.000" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""One is `view-references`,""" start="00:07:32.760" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""which does nothing but open up the reference file""" start="00:07:34.540" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and switch to that buffer""" start="00:07:37.807" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""if you're not already on it.""" start="00:07:39.400" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And then there's one other here, `edit-references`,""" start="00:07:42.540" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""which does the exact same thing except for""" start="00:07:45.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""it also goes over all the text in the buffer""" start="00:07:50.160" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and makes it writable.""" start="00:07:53.560" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So if I really do want to edit those other references,""" start="00:07:55.040" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I've got a function to quickly make that possible.""" start="00:07:58.120" video="mainVideo-ref" id="subtitle"]]
+[[!template new="1" text="""Let me give an example of this.""" start="00:08:02.720" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I type in here, new reference.""" start="00:08:07.500" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Now I've jumped to the end of my references file.""" start="00:08:13.980" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""See, it's ready to take the title.""" start="00:08:16.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Well, I guess I need to have something,""" start="00:08:19.080" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""some content, to put in here.""" start="00:08:21.720" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Let's say I was looking through Elfeed,""" start="00:08:23.660" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and let's say I found this interesting article""" start="00:08:28.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""about Mars earthquakes.""" start="00:08:31.600" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Let's say I open it up [and]""" start="00:08:38.220" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I read through the article.""" start="00:08:40.007" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""First, I'd figure out what it is""" start="00:08:41.160" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that I find interesting about this, what it is that""" start="00:08:43.840" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I'm going to want to remember and look up later.""" start="00:08:47.260" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So I come up with a quick title based on that.""" start="00:08:51.580" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Let's go back to the references with `view-reference`.""" start="00:08:57.480" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And, let's just call it""" start="00:09:01.900" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""&quot;Study of Mars Earthquake.&quot;""" start="00:09:05.674" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Now I'm going to also want to put in some tags.""" start="00:09:13.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""On my system, that's done with""" start="00:09:18.200" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Control C, Control Q (`C-c C-q`).""" start="00:09:21.107" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And I can put in some tags.""" start="00:09:23.640" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I like to go ahead and insert the colons.""" start="00:09:25.520" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""You can leave those out,""" start="00:09:29.160" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""but they're going to get added anyway,""" start="00:09:30.800" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""so I'm in the habit of using them.""" start="00:09:32.560" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Let's say we'll call this 'Astronomy' as one tag,""" start="00:09:36.780" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and the next tag could be 'Planets'.""" start="00:09:41.120" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""If I wanted to use a tag""" start="00:09:47.060" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that was more than one word in the tag,""" start="00:09:48.400" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I'd need to use underscores or something like that.""" start="00:09:50.400" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""If I wanted a tag that was 'Mars Earthquakes',""" start="00:09:53.540" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I could do it like that, but that's kind of silly.""" start="00:10:00.500" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Now I try not to be too clever with the tags.""" start="00:10:05.060" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I don't spend a lot of time thinking about them.""" start="00:10:08.660" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I just come up with some general buckets""" start="00:10:10.600" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""to throw things in.""" start="00:10:13.107" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""You can see the tags were added there,""" start="00:10:15.020" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""to the right of the title.""" start="00:10:16.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Now you can see down here under PROPERTIES,""" start="00:10:19.380" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""the ID has already been added,""" start="00:10:23.400" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""the Date_Created has been added.""" start="00:10:25.320" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Sometimes, I'll like to put in the publication year,""" start="00:10:27.040" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and for that, I use the `org-set-property` command.""" start="00:10:30.200" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Publication_Year, this year in this case.""" start="00:10:38.140" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And then I just need to paste in the URL.""" start="00:10:43.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I do that manually.""" start="00:10:46.680" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I use Org's bracket format for that.""" start="00:10:48.080" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So I start that, go back to the article,""" start="00:10:53.480" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""copy the URL, paste that in.""" start="00:10:57.640" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""If I want, I can add it in the title""" start="00:11:02.100" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""with the second pair of brackets here.""" start="00:11:04.480" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Don't have to, but often like to.""" start="00:11:07.460" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Close that off, and there it is.""" start="00:11:14.200" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""That was really it.""" start="00:11:18.560" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I add a return on the end here,""" start="00:11:20.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""just so the next entry comes out with the right spacing.""" start="00:11:22.120" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""But really, that's it,""" start="00:11:26.620" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and typically, when I'm not explaining it,""" start="00:11:28.307" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that only takes 20 seconds or so, or 30 seconds.""" start="00:11:31.000" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Pretty quick. Pretty easy.""" start="00:11:37.500" video="mainVideo-ref" id="subtitle"]]
+[[!template new="1" text="""What about searching later?""" start="00:11:41.540" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Well, often the easiest thing is just do a simple,""" start="00:11:45.540" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""boring incremental search.""" start="00:11:50.474" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I usually know roughly""" start="00:11:54.640" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""what it is that I'm looking for already.""" start="00:11:55.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""If I was looking for that wildflower article,""" start="00:11:58.500" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I could just do an incremental search for wildflowers""" start="00:12:02.380" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and jump through that. It's pretty simple.""" start="00:12:06.000" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Not very impressive, but honestly, most of the time""" start="00:12:07.920" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that gets me there pretty quick.""" start="00:12:13.200" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Sometimes I find it useful to do an Occur search,""" start="00:12:16.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""more specifically a Helm Occur search.""" start="00:12:20.360" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""If I use the `helm-occur` command,""" start="00:12:23.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""then I like to use this to search by tag.""" start="00:12:31.260" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""That's where it really becomes handy.""" start="00:12:34.680" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Let's say I want to narrow it down""" start="00:12:36.760" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""to all my astronomy references""" start="00:12:39.207" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and then narrow it down a little bit more to planets.""" start="00:12:42.640" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I can put spaces in between and it still works.""" start="00:12:50.040" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""You can see here in one window,""" start="00:12:54.120" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""it gives me the bottom window there.""" start="00:12:57.200" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""It's giving…, just because of the way""" start="00:13:00.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""the tags are formatted with the title, it gives me""" start="00:13:03.480" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""a list of all the titles that have those tags.""" start="00:13:06.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""And I usually find what I want pretty quick""" start="00:13:09.520" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""by just tapping through here.""" start="00:13:11.520" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Once I find the one that I think I want,""" start="00:13:13.400" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I press enter, and now I'm focused on just that entry.""" start="00:13:16.500" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""There is some advanced functionality, I believe,""" start="00:13:24.140" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that I used in the past where you could search""" start="00:13:26.960" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""based on the property fields.""" start="00:13:29.960" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So do something like search for publication —""" start="00:13:33.120" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""the most recent publications in the last 10 years.""" start="00:13:37.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""There's some kind of advanced syntax for that,""" start="00:13:42.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""which I used once or twice.""" start="00:13:46.200" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Honestly, I use that so infrequently""" start="00:13:48.220" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""that I have to go back to the Emacs manual""" start="00:13:51.400" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and figure it out each time, and figure out again""" start="00:13:54.840" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""how I did that the last time.""" start="00:13:57.740" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""But since I do it only once""" start="00:13:59.880" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""every three or four months, it's not a problem.""" start="00:14:02.000" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So I'm not going to go over that today.""" start="00:14:06.680" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""That's pretty much it in a nutshell.""" start="00:14:11.520" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Again, the code that I wrote, this specific approach""" start="00:14:16.480" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""is not really what I'm recommending.""" start="00:14:19.974" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""But here it is if you really do want to use it.""" start="00:14:24.280" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Maybe I can make a link to the URL""" start="00:14:31.160" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""and share that in the chat room or something.""" start="00:14:36.240" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""But I consider this to be trivial code.""" start="00:14:40.060" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""So just use that if you want to use it.""" start="00:14:46.760" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I should be signing off here now.""" start="00:14:49.800" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""I should be in the chat room, in the IRC chat room,""" start="00:14:53.440" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""or you can reach out to me by email if you'd like.""" start="00:14:58.260" video="mainVideo-ref" id="subtitle"]]
+[[!template text="""Thank you very much.""" start="00:15:01.920" video="mainVideo-ref" id="subtitle"]]
+
+
+
+Captioner: bhavin192
+
Questions or comments? Please e-mail [christopher@librehacker.com](mailto:christopher@librehacker.com?subject=Comment%20for%20EmacsConf%202022%20ref%3A%20Org-Mode%20workflow%3A%20informal%20reference%20tracking)
diff --git a/2023/info/ref-before.md b/2023/info/ref-before.md
index 1b9c06f6..8b7d1059 100644
--- a/2023/info/ref-before.md
+++ b/2023/info/ref-before.md
@@ -8,12 +8,20 @@ The following image shows where the talk is in the schedule for Sat 2023-12-02.
Format: 16-min talk; Q&A: IRC <https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen>
Etherpad: <https://pad.emacsconf.org/2023-ref>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Ready to stream
-<div>Times in different timezones:</div><div class="times" start="2023-12-02T19:55:00Z" end="2023-12-02T20:15:00Z"><div class="conf-time">Saturday, Dec 2 2023, ~2:55 PM - 3:15 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 2 2023, ~1:55 PM - 2:15 PM CST (US/Central)<br />Saturday, Dec 2 2023, ~12:55 PM - 1:15 PM MST (US/Mountain)<br />Saturday, Dec 2 2023, ~11:55 AM - 12:15 PM PST (US/Pacific)<br />Saturday, Dec 2 2023, ~7:55 PM - 8:15 PM UTC <br />Saturday, Dec 2 2023, ~8:55 PM - 9:15 PM CET (Europe/Paris)<br />Saturday, Dec 2 2023, ~9:55 PM - 10:15 PM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~1:25 AM - 1:45 AM IST (Asia/Kolkata)<br />Sunday, Dec 3 2023, ~3:55 AM - 4:15 AM +08 (Asia/Singapore)<br />Sunday, Dec 3 2023, ~4:55 AM - 5:15 AM JST (Asia/Tokyo)</div></div><div><a href="/2023/watch/gen/">Find out how to watch and participate</a></div>
+Status: All done
+<div class="vid"><video controls preload="none" id="ref-mainVideo"><source src="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2023/captions/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2023/captions/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="ref-mainVideo" data="""
+00:00.000 Introduction
+02:06.040 Tip about completion frameworks
+03:14.920 References file overview
+05:39.320 The Emacs Lisp code
+08:02.720 Example reference to Elfeed article
+11:41.540 Searching the references
+
+"""]]<div></div>Duration: 15:04 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2023-ref">Open Etherpad</a></li><li><a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--final.webm">Download --final.webm (38MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main.ogg">Download --main.ogg (7.9MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main.opus">Download --main.opus (7.8MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--main.webm">Download --main.webm (38MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--normalized--after-zaeph.opus">Download --normalized--after-zaeph.opus (11MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--normalized.opus">Download --normalized.opus (11MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--original.mp4">Download --original.mp4 (23MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-ref--orgmode-workflow-informal-reference-tracking--christopher-howard--reencoded.webm">Download --reencoded.webm (38MB)</a></li><li><a href="https://toobnix.org/w/cYpEatASFWXLzDfKH4Fhec">View on Toobnix</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2023/info/repl-before.md b/2023/info/repl-before.md
index 29115525..01f079ce 100644
--- a/2023/info/repl-before.md
+++ b/2023/info/repl-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2023-12-02.
Format: 60-min talk; Q&A: IRC <https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev>
Etherpad: <https://pad.emacsconf.org/2023-repl>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Processing uploaded video
-<div>Times in different timezones:</div><div class="times" start="2023-12-02T19:00:00Z" end="2023-12-02T20:00:00Z"><div class="conf-time">Saturday, Dec 2 2023, ~2:00 PM - 3:00 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 2 2023, ~1:00 PM - 2:00 PM CST (US/Central)<br />Saturday, Dec 2 2023, ~12:00 PM - 1:00 PM MST (US/Mountain)<br />Saturday, Dec 2 2023, ~11:00 AM - 12:00 PM PST (US/Pacific)<br />Saturday, Dec 2 2023, ~7:00 PM - 8:00 PM UTC <br />Saturday, Dec 2 2023, ~8:00 PM - 9:00 PM CET (Europe/Paris)<br />Saturday, Dec 2 2023, ~9:00 PM - 10:00 PM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~12:30 AM - 1:30 AM IST (Asia/Kolkata)<br />Sunday, Dec 3 2023, ~3:00 AM - 4:00 AM +08 (Asia/Singapore)<br />Sunday, Dec 3 2023, ~4:00 AM - 5:00 AM JST (Asia/Tokyo)</div></div><div><a href="/2023/watch/dev/">Find out how to watch and participate</a></div>
+Status: All done
+<div class="vid"><video controls preload="none" id="repl-mainVideo"><source src="https://media.emacsconf.org/2023/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--original.mp4" />${captions}<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div>Duration: 59:10 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2023-repl">Open Etherpad</a></li><li><a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.opus">Download --main.opus (29MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.webm">Download --main.webm (187MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--normalized.opus">Download --normalized.opus (43MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--original.aac">Download --original.aac (55MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--original.mp4">Download --original.mp4 (104MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--reencoded.webm">Download --reencoded.webm (173MB)</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2023/info/sat-close-before.md b/2023/info/sat-close-before.md
index da393ecb..8dcefa00 100644
--- a/2023/info/sat-close-before.md
+++ b/2023/info/sat-close-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2023-12-02.
Format: 10-min talk; Q&A: ask questions via Etherpad/IRC; we'll e-mail the speaker and post answers on this wiki page after the conference
Etherpad: <https://pad.emacsconf.org/2023-sat-close>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Ready to stream
-<div>Times in different timezones:</div><div class="times" start="2023-12-02T22:05:00Z" end="2023-12-02T22:15:00Z"><div class="conf-time">Saturday, Dec 2 2023, ~5:05 PM - 5:15 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 2 2023, ~4:05 PM - 4:15 PM CST (US/Central)<br />Saturday, Dec 2 2023, ~3:05 PM - 3:15 PM MST (US/Mountain)<br />Saturday, Dec 2 2023, ~2:05 PM - 2:15 PM PST (US/Pacific)<br />Saturday, Dec 2 2023, ~10:05 PM - 10:15 PM UTC <br />Saturday, Dec 2 2023, ~11:05 PM - 11:15 PM CET (Europe/Paris)<br />Sunday, Dec 3 2023, ~12:05 AM - 12:15 AM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~3:35 AM - 3:45 AM IST (Asia/Kolkata)<br />Sunday, Dec 3 2023, ~6:05 AM - 6:15 AM +08 (Asia/Singapore)<br />Sunday, Dec 3 2023, ~7:05 AM - 7:15 AM JST (Asia/Tokyo)</div></div><div><a href="/2023/watch/gen/">Find out how to watch and participate</a></div>
+Status: All done
+<div class="vid"><div></div><div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2023-sat-close">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-sat-close--saturday-closing-remarks--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-sat-close--saturday-closing-remarks--intro.webm">Download --intro.webm</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2023/info/solo-before.md b/2023/info/solo-before.md
index 67f3019b..91c117b1 100644
--- a/2023/info/solo-before.md
+++ b/2023/info/solo-before.md
@@ -1,15 +1,15 @@
<!-- Automatically generated by emacsconf-publish-before-page -->
The following image shows where the talk is in the schedule for Sat 2023-12-02. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="solo">
-<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2023/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2023/talks/adventure" title="An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp" data-slug="adventure"> <title> 9:10- 9:20 An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp</title> <rect x="15" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> adventure</text></g></a> <a href="/2023/talks/uni" title="Authoring and presenting university courses with Emacs and a full libre software stack" data-slug="uni"> <title> 9:30- 9:50 Authoring and presenting university courses with Emacs and a full libre software stack</title> <rect x="47" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(76,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> uni</text></g></a> <a href="/2023/talks/teaching" title="Teaching computer and data science with literate programming tools" data-slug="teaching"> <title> 10:05-10:25 Teaching computer and data science with literate programming tools</title> <rect x="101" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(130,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> teaching</text></g></a> <a href="/2023/talks/table" title="Who needs Excel? Managing your students qualifications with org-table" data-slug="table"> <title> 10:40-10:50 Who needs Excel? Managing your students qualifications with org-table</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> table</text></g></a> <a href="/2023/talks/taming" title="Taming things with Org Mode" data-slug="taming"> <title> 11:05-11:15 Taming things with Org Mode</title> <rect x="196" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(209,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> taming</text></g></a> <a href="/2023/talks/one" title="one.el: the static site generator for Emacs Lisp Programmers" data-slug="one"> <title> 11:30-11:50 one.el: the static site generator for Emacs Lisp Programmers</title> <rect x="235" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(264,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> one</text></g></a> <a href="/2023/talks/writing" title="Emacs turbo-charges my writing" data-slug="writing"> <title> 1:00- 1:10 Emacs turbo-charges my writing</title> <rect x="376" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(389,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2023/talks/nabokov" title="Why Nabokov would use Org-Mode if he were writing today" data-slug="nabokov"> <title> 1:25- 1:35 Why Nabokov would use Org-Mode if he were writing today</title> <rect x="415" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(428,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> nabokov</text></g></a> <a href="/2023/talks/collab" title="Collaborative data processing and documenting using org-babel" data-slug="collab"> <title> 1:50- 2:10 Collaborative data processing and documenting using org-babel</title> <rect x="454" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(483,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> collab</text></g></a> <a href="/2023/talks/solo" title="How I play TTRPGs in Emacs" data-slug="solo"> <title> 2:20- 2:40 How I play TTRPGs in Emacs</title> <rect stroke-width="3" x="501" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(530,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> solo</text></g></a> <a href="/2023/talks/ref" title="Org-Mode workflow: informal reference tracking" data-slug="ref"> <title> 2:55- 3:15 Org-Mode workflow: informal reference tracking</title> <rect x="556" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(585,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> ref</text></g></a> <a href="/2023/talks/unentangling" title="(Un)entangling projects and repos" data-slug="unentangling"> <title> 3:25- 3:35 (Un)entangling projects and repos</title> <rect x="603" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(616,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> unentangling</text></g></a> <a href="/2023/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 3:45- 3:55 Emacs development updates</title> <rect x="635" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(648,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2023/talks/core" title="Emacs core development: how it works" data-slug="core"> <title> 4:10- 4:50 Emacs core development: how it works</title> <rect x="674" y="15" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(734,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> core</text></g></a> <a href="/2023/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:05- 5:15 Saturday closing remarks</title> <rect x="760" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(773,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2023/talks/matplotllm" title="MatplotLLM, iterative natural language data visualization in org-babel" data-slug="matplotllm"> <title> 10:00-10:10 MatplotLLM, iterative natural language data visualization in org-babel</title> <rect x="94" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(107,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> matplotllm</text></g></a> <a href="/2023/talks/voice" title="Enhancing productivity with voice computing" data-slug="voice"> <title> 10:20-10:40 Enhancing productivity with voice computing</title> <rect x="125" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(154,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> voice</text></g></a> <a href="/2023/talks/llm" title="LLM clients in Emacs, functionality and standardization" data-slug="llm"> <title> 10:55-11:15 LLM clients in Emacs, functionality and standardization</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> llm</text></g></a> <a href="/2023/talks/overlay" title="Improving compiler diagnostics with overlays" data-slug="overlay"> <title> 1:00- 1:20 Improving compiler diagnostics with overlays</title> <rect x="376" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(405,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> overlay</text></g></a> <a href="/2023/talks/eval" title="Editor Integrated REPL Driven Development for all languages" data-slug="eval"> <title> 1:35- 1:45 Editor Integrated REPL Driven Development for all languages</title> <rect x="431" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(444,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eval</text></g></a> <a href="/2023/talks/repl" title="REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ" data-slug="repl"> <title> 2:00- 3:00 REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ</title> <rect x="470" y="75" opacity="0.5" width="94" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(562,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> repl</text></g></a> <a href="/2023/talks/doc" title="Literate Documentation with Emacs and Org Mode" data-slug="doc"> <title> 3:10- 3:50 Literate Documentation with Emacs and Org Mode</title> <rect x="580" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(640,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> doc</text></g></a> <a href="/2023/talks/windows" title="Windows into Freedom" data-slug="windows"> <title> 4:05- 4:45 Windows into Freedom</title> <rect x="666" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(726,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> windows</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2023/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2023/talks/adventure" title="An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp" data-slug="adventure"> <title> 9:10- 9:20 An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp</title> <rect x="15" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> adventure</text></g></a> <a href="/2023/talks/uni" title="Authoring and presenting university courses with Emacs and a full libre software stack" data-slug="uni"> <title> 9:30- 9:50 Authoring and presenting university courses with Emacs and a full libre software stack</title> <rect x="47" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(76,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> uni</text></g></a> <a href="/2023/talks/teaching" title="Teaching computer and data science with literate programming tools" data-slug="teaching"> <title> 10:05-10:25 Teaching computer and data science with literate programming tools</title> <rect x="101" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(130,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> teaching</text></g></a> <a href="/2023/talks/table" title="Who needs Excel? Managing your students qualifications with org-table" data-slug="table"> <title> 10:40-10:50 Who needs Excel? Managing your students qualifications with org-table</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> table</text></g></a> <a href="/2023/talks/one" title="one.el: the static site generator for Emacs Lisp Programmers" data-slug="one"> <title> 11:30-11:50 one.el: the static site generator for Emacs Lisp Programmers</title> <rect x="235" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(264,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> one</text></g></a> <a href="/2023/talks/writing" title="Emacs turbo-charges my writing" data-slug="writing"> <title> 1:00- 1:10 Emacs turbo-charges my writing</title> <rect x="376" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(389,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2023/talks/nabokov" title="Why Nabokov would use Org-Mode if he were writing today" data-slug="nabokov"> <title> 1:25- 1:35 Why Nabokov would use Org-Mode if he were writing today</title> <rect x="415" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(428,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> nabokov</text></g></a> <a href="/2023/talks/collab" title="Collaborative data processing and documenting using org-babel" data-slug="collab"> <title> 1:50- 2:10 Collaborative data processing and documenting using org-babel</title> <rect x="454" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(483,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> collab</text></g></a> <a href="/2023/talks/solo" title="How I play TTRPGs in Emacs" data-slug="solo"> <title> 2:20- 2:40 How I play TTRPGs in Emacs</title> <rect stroke-width="3" x="501" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(530,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> solo</text></g></a> <a href="/2023/talks/ref" title="Org-Mode workflow: informal reference tracking" data-slug="ref"> <title> 2:55- 3:15 Org-Mode workflow: informal reference tracking</title> <rect x="556" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(585,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> ref</text></g></a> <a href="/2023/talks/unentangling" title="(Un)entangling projects and repos" data-slug="unentangling"> <title> 3:25- 3:35 (Un)entangling projects and repos</title> <rect x="603" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(616,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> unentangling</text></g></a> <a href="/2023/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 3:45- 3:55 Emacs development updates</title> <rect x="635" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(648,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2023/talks/core" title="Emacs core development: how it works" data-slug="core"> <title> 4:10- 4:50 Emacs core development: how it works</title> <rect x="674" y="15" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(734,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> core</text></g></a> <a href="/2023/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:05- 5:15 Saturday closing remarks</title> <rect x="760" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(773,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2023/talks/matplotllm" title="MatplotLLM, iterative natural language data visualization in org-babel" data-slug="matplotllm"> <title> 10:00-10:10 MatplotLLM, iterative natural language data visualization in org-babel</title> <rect x="94" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(107,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> matplotllm</text></g></a> <a href="/2023/talks/voice" title="Enhancing productivity with voice computing" data-slug="voice"> <title> 10:20-10:40 Enhancing productivity with voice computing</title> <rect x="125" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(154,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> voice</text></g></a> <a href="/2023/talks/llm" title="LLM clients in Emacs, functionality and standardization" data-slug="llm"> <title> 10:55-11:15 LLM clients in Emacs, functionality and standardization</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> llm</text></g></a> <a href="/2023/talks/overlay" title="Improving compiler diagnostics with overlays" data-slug="overlay"> <title> 1:00- 1:20 Improving compiler diagnostics with overlays</title> <rect x="376" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(405,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> overlay</text></g></a> <a href="/2023/talks/eval" title="Editor Integrated REPL Driven Development for all languages" data-slug="eval"> <title> 1:35- 1:45 Editor Integrated REPL Driven Development for all languages</title> <rect x="431" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(444,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eval</text></g></a> <a href="/2023/talks/repl" title="REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ" data-slug="repl"> <title> 2:00- 3:00 REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ</title> <rect x="470" y="75" opacity="0.5" width="94" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(562,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> repl</text></g></a> <a href="/2023/talks/doc" title="Literate Documentation with Emacs and Org Mode" data-slug="doc"> <title> 3:10- 3:50 Literate Documentation with Emacs and Org Mode</title> <rect x="580" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(640,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> doc</text></g></a> <a href="/2023/talks/windows" title="Windows into Freedom" data-slug="windows"> <title> 4:05- 4:45 Windows into Freedom</title> <rect x="666" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(726,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> windows</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
</div>
[[!toc ]]
Format: 15-min talk; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2023/current/bbb-solo.html>
Etherpad: <https://pad.emacsconf.org/2023-solo>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Q&A open for participation
-<div>Times in different timezones:</div><div class="times" start="2023-12-02T19:20:00Z" end="2023-12-02T19:40:00Z"><div class="conf-time">Saturday, Dec 2 2023, ~2:20 PM - 2:40 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 2 2023, ~1:20 PM - 1:40 PM CST (US/Central)<br />Saturday, Dec 2 2023, ~12:20 PM - 12:40 PM MST (US/Mountain)<br />Saturday, Dec 2 2023, ~11:20 AM - 11:40 AM PST (US/Pacific)<br />Saturday, Dec 2 2023, ~7:20 PM - 7:40 PM UTC <br />Saturday, Dec 2 2023, ~8:20 PM - 8:40 PM CET (Europe/Paris)<br />Saturday, Dec 2 2023, ~9:20 PM - 9:40 PM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~12:50 AM - 1:10 AM IST (Asia/Kolkata)<br />Sunday, Dec 3 2023, ~3:20 AM - 3:40 AM +08 (Asia/Singapore)<br />Sunday, Dec 3 2023, ~4:20 AM - 4:40 AM JST (Asia/Tokyo)</div></div><div><a href="/2023/watch/gen/">Find out how to watch and participate</a></div>
+Status: All done
+
diff --git a/2023/info/unentangling-before.md b/2023/info/unentangling-before.md
index 63b991c2..c1621f2e 100644
--- a/2023/info/unentangling-before.md
+++ b/2023/info/unentangling-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2023-12-02.
Format: 13-min talk; Q&A: Etherpad <https://pad.emacsconf.org/2023-unentangling>
Etherpad: <https://pad.emacsconf.org/2023-unentangling>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Processing uploaded video
-<div>Times in different timezones:</div><div class="times" start="2023-12-02T20:25:00Z" end="2023-12-02T20:35:00Z"><div class="conf-time">Saturday, Dec 2 2023, ~3:25 PM - 3:35 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 2 2023, ~2:25 PM - 2:35 PM CST (US/Central)<br />Saturday, Dec 2 2023, ~1:25 PM - 1:35 PM MST (US/Mountain)<br />Saturday, Dec 2 2023, ~12:25 PM - 12:35 PM PST (US/Pacific)<br />Saturday, Dec 2 2023, ~8:25 PM - 8:35 PM UTC <br />Saturday, Dec 2 2023, ~9:25 PM - 9:35 PM CET (Europe/Paris)<br />Saturday, Dec 2 2023, ~10:25 PM - 10:35 PM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~1:55 AM - 2:05 AM IST (Asia/Kolkata)<br />Sunday, Dec 3 2023, ~4:25 AM - 4:35 AM +08 (Asia/Singapore)<br />Sunday, Dec 3 2023, ~5:25 AM - 5:35 AM JST (Asia/Tokyo)</div></div><div><a href="/2023/watch/gen/">Find out how to watch and participate</a></div>
+Status: All done
+<div class="vid"><video controls preload="none" id="unentangling-mainVideo"><source src="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--main.webm" />${captions}<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div>Duration: 12:39 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2023-unentangling">Open Etherpad</a></li><li><a href="https://pad.emacsconf.org/2023-unentangling">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--main--after-zaeph.webm">Download --main--after-zaeph.webm (68MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--main.opus">Download --main.opus (10MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--main.txt">Download --main.txt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--main.webm">Download --main.webm (68MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--normalized.opus">Download --normalized.opus (14MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--original.webm">Download --original.webm (101MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-unentangling--unentangling-projects-and-repos--alexey-bochkarev--reencoded.webm">Download --reencoded.webm (64MB)</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2023/info/windows-before.md b/2023/info/windows-before.md
index 2ee8fafd..ca6781d3 100644
--- a/2023/info/windows-before.md
+++ b/2023/info/windows-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2023-12-02.
Format: 40-min talk; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2023/current/bbb-windows.html>
Etherpad: <https://pad.emacsconf.org/2023-windows>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Waiting for video from speaker
-<div>Times in different timezones:</div><div class="times" start="2023-12-02T21:05:00Z" end="2023-12-02T21:45:00Z"><div class="conf-time">Saturday, Dec 2 2023, ~4:05 PM - 4:45 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 2 2023, ~3:05 PM - 3:45 PM CST (US/Central)<br />Saturday, Dec 2 2023, ~2:05 PM - 2:45 PM MST (US/Mountain)<br />Saturday, Dec 2 2023, ~1:05 PM - 1:45 PM PST (US/Pacific)<br />Saturday, Dec 2 2023, ~9:05 PM - 9:45 PM UTC <br />Saturday, Dec 2 2023, ~10:05 PM - 10:45 PM CET (Europe/Paris)<br />Saturday, Dec 2 2023, ~11:05 PM - 11:45 PM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~2:35 AM - 3:15 AM IST (Asia/Kolkata)<br />Sunday, Dec 3 2023, ~5:05 AM - 5:45 AM +08 (Asia/Singapore)<br />Sunday, Dec 3 2023, ~6:05 AM - 6:45 AM JST (Asia/Tokyo)</div></div><div><a href="/2023/watch/dev/">Find out how to watch and participate</a></div>
+Status: All done
+<div class="vid"><div></div><div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2023-windows">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2023/current/bbb-windows.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-windows--windows-into-freedom--corwin-brust--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-windows--windows-into-freedom--corwin-brust--intro.webm">Download --intro.webm</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file