WEBVTT captioned by bhavin192 00:00:00.000 --> 00:00:04.600 Hello. Welcome to my first ever EmacsConf talk. 00:00:04.600 --> 00:00:06.360 This is really exciting for me. 00:00:06.360 --> 00:00:08.600 I've done lots of conferences, 00:00:08.600 --> 00:00:12.800 but rarely ones this technical and this nerdy. 00:00:12.800 --> 00:00:13.508 I also feel like 00:00:13.508 --> 00:00:15.040 I have something interesting to share. 00:00:15.040 --> 00:00:18.680 I come to Emacs relatively late in my career, 00:00:18.680 --> 00:00:20.920 only about six years ago, 00:00:20.920 --> 00:00:22.880 but I've been absolutely amazed 00:00:22.880 --> 00:00:25.800 at the innovation and commitment of the community 00:00:25.800 --> 00:00:28.200 to do things their own way. 00:00:28.200 --> 00:00:30.120 Oftentimes, these become things 00:00:30.120 --> 00:00:33.880 that are not readily available anywhere else. 00:00:33.880 --> 00:00:35.307 So, as I've been using Emacs 00:00:35.307 --> 00:00:37.160 (and Org mode specifically) 00:00:37.160 --> 00:00:39.600 a great deal in my day-to-day workflows, 00:00:39.600 --> 00:00:41.520 I've been leaning more and more into 00:00:41.520 --> 00:00:43.607 some of these tips and tricks. 00:00:43.607 --> 00:00:46.680 I find that there is almost every day 00:00:46.680 --> 00:00:48.120 that I discover some useful tweak 00:00:48.120 --> 00:00:50.760 that can make my development better. 00:00:50.760 --> 00:00:53.960 I want to share them with you now. 00:00:53.960 --> 00:00:54.874 [Future George]: Hey, hold on! 00:00:54.874 --> 00:00:56.200 Who are you? 00:00:56.200 --> 00:01:00.400 [Future George]: I'm you from the future! 00:01:00.400 --> 00:01:02.480 Oh, nice. How good. 00:01:02.480 --> 00:01:05.240 No, I'm you from, like, a month from now. 00:01:05.240 --> 00:01:08.440 Look, you know how these talks are pre-recorded, 00:01:08.440 --> 00:01:10.760 and you know how you've spent the last two years 00:01:10.760 --> 00:01:12.400 criticizing conference speakers 00:01:12.400 --> 00:01:14.000 for trying to do the same old thing 00:01:14.000 --> 00:01:15.120 and not creatively adapting 00:01:15.120 --> 00:01:17.440 to the online conference medium? 00:01:17.440 --> 00:01:20.520 Well, you are recording this back in November. 00:01:20.520 --> 00:01:23.160 I'm in December when everyone is watching this 00:01:23.160 --> 00:01:24.720 for the first time. 00:01:24.720 --> 00:01:27.120 That is something we can do now. 00:01:27.120 --> 00:01:29.640 [George]: Okay, so this is a gimmick. 00:01:29.640 --> 00:01:32.880 Cool! And I see you still haven't figured out 00:01:32.880 --> 00:01:35.440 how to remove backgrounds with OBS. 00:01:35.440 --> 00:01:37.240 [Future George]: Oh my god! It's such a pain, 00:01:37.240 --> 00:01:40.360 I have to get a plugin or something. 00:01:40.360 --> 00:01:42.760 So, yes, it's kind of a gimmick, 00:01:42.760 --> 00:01:44.920 but I also have a cool point. 00:01:44.920 --> 00:01:46.200 You know, how you just said 00:01:46.200 --> 00:01:48.840 that you discover something new every day? 00:01:48.840 --> 00:01:49.920 Well, your talk isn't that long, 00:01:49.920 --> 00:01:52.720 and I found a bunch of cool new workflow synths. 00:01:52.720 --> 00:01:55.920 [George]: Oh, okay, that makes sense. 00:01:55.920 --> 00:01:58.360 I'm starting a new job in the intervening time. 00:01:58.360 --> 00:01:59.720 [Future George]: Exactly! 00:01:59.720 --> 00:02:02.440 So, I have more stuff I want to add. 00:02:02.440 --> 00:02:03.740 [George]: Oh, and I bet that 00:02:03.740 --> 00:02:05.960 once we set the ground rules, 00:02:05.960 --> 00:02:07.136 the audience might have 00:02:07.136 --> 00:02:08.960 some of their own suggestions. 00:02:08.960 --> 00:02:11.160 That is a good idea. 00:02:11.160 --> 00:02:11.960 Okay, go away now. 00:02:11.960 --> 00:02:13.574 [Future George]: Fine, but 00:02:13.574 --> 00:02:15.240 aren't you gonna explain the dino? 00:02:15.240 --> 00:02:18.800 [George]: This is EmacsConf, dude. 00:02:18.800 --> 00:02:20.320 You think a dinosaur built out of 00:02:20.320 --> 00:02:22.160 boxes and old dishwasher parts 00:02:22.160 --> 00:02:24.207 is the weirdest background thing we'll see? 00:02:24.207 --> 00:02:27.880 [Both making dinosaur roaring sound: ROAAAAR!] 00:02:27.880 --> 00:02:30.200 Okay, bye now. 00:02:30.200 --> 00:02:33.160 Hey everyone, you heard the idea. 00:02:33.160 --> 00:02:35.000 This is going to be a thinly-veiled attempt 00:02:35.000 --> 00:02:36.940 to show you stuff about 00:02:36.940 --> 00:02:38.760 Emacs and Org mode, specifically, 00:02:38.760 --> 00:02:41.560 that I think is super cool and immediately useful 00:02:41.560 --> 00:02:43.600 while you're doing development. 00:02:43.600 --> 00:02:46.720 Let's define the scope of Org development workflow 00:02:46.720 --> 00:02:49.000 as something specific you do with Org mode 00:02:49.000 --> 00:02:50.800 that helps in certain common 00:02:50.800 --> 00:02:52.880 development related activities. 00:02:52.880 --> 00:02:54.560 Now, tie-dye me from the future said 00:02:54.560 --> 00:02:56.960 he's got some more ideas 00:02:56.960 --> 00:02:58.840 beyond what I'm presenting here. 00:02:58.840 --> 00:03:01.960 I'm sure many of you have ideas as well. 00:03:01.960 --> 00:03:07.960 So, we're going to share a collaborative document, 00:03:07.960 --> 00:03:10.120 and let's all as we're listening to this 00:03:10.120 --> 00:03:11.440 be talking, and chatting, and entering 00:03:11.440 --> 00:03:13.240 our own ideas and workflows, 00:03:13.240 --> 00:03:15.680 so that we can learn and improve together. 00:03:15.680 --> 00:03:17.960 And now with that, let's begin. 00:03:17.960 --> 00:03:20.280 I've got a ton of ground to cover, 00:03:20.280 --> 00:03:23.480 and I want to start by talking about note-taking. 00:03:23.480 --> 00:03:25.720 Shrink down! [transition] 00:03:25.720 --> 00:03:30.074 Note-taking is incredibly important. 00:03:30.074 --> 00:03:33.600 We can't keep all this stuff in our heads. 00:03:33.600 --> 00:03:36.640 So, for example, I find myself with 00:03:36.640 --> 00:03:41.760 the need to learn about the solid project. 00:03:41.760 --> 00:03:44.520 This right here is the solid project, 00:03:44.520 --> 00:03:47.320 and I want to play around with it. 00:03:47.320 --> 00:03:50.920 I am going to start by creating a note for it. 00:03:50.920 --> 00:03:53.360 Now, one of the things that I want to do 00:03:53.360 --> 00:03:57.240 is explore one of their tutorials. 00:03:57.240 --> 00:03:58.960 That's the site I just saw. 00:03:58.960 --> 00:04:03.720 I can go ahead and create a note for myself. 00:04:03.720 --> 00:04:10.280 Right, "Solid React Example", 00:04:10.280 --> 00:04:12.120 and maybe a set of stuff ending on there. 00:04:12.120 --> 00:04:14.240 I'm going to clone this project, 00:04:14.240 --> 00:04:15.720 which I've already done, 00:04:15.720 --> 00:04:18.360 and I can pull it up right here. 00:04:18.360 --> 00:04:22.280 So, I can pull it up right here, 00:04:22.280 --> 00:04:24.440 and I can now start to explore it. 00:04:24.440 --> 00:04:26.440 So, for example, this code base sounds…, 00:04:26.440 --> 00:04:27.080 it seems interesting. 00:04:27.080 --> 00:04:28.996 I'm going to want to 00:04:28.996 --> 00:04:31.520 store a link to this in my code. 00:04:31.520 --> 00:04:34.840 I'm going to run `org-store-link`, 00:04:34.840 --> 00:04:37.960 and I can come in here and say, 00:04:37.960 --> 00:04:48.280 let's explore structure. Local link, 00:04:48.280 --> 00:04:50.640 and here I'm going to put that right there. 00:04:50.640 --> 00:04:52.960 Now, at any given time I can come into this note 00:04:52.960 --> 00:04:54.600 and be thrown right into the structure. 00:04:54.600 --> 00:04:58.880 I want to go and now start investigating the code, 00:04:58.880 --> 00:05:02.474 but before doing that 00:05:02.474 --> 00:05:08.280 I'm going to take an extra step 00:05:08.280 --> 00:05:13.560 and customize the Org capture system. 00:05:13.560 --> 00:05:16.297 I'm going to create a playground node here, 00:05:16.297 --> 00:05:17.320 where I can do whatever. 00:05:17.320 --> 00:05:20.680 Now, what does this template do? 00:05:20.680 --> 00:05:22.960 Well, it's just going to create a new template. 00:05:22.960 --> 00:05:24.640 And whenever I hit the s key, 00:05:24.640 --> 00:05:31.680 it is going to go ahead and add a new heading 00:05:31.680 --> 00:05:36.280 to which I will enter, 00:05:36.280 --> 00:05:38.326 and it's going to grab a link 00:05:38.326 --> 00:05:39.720 to wherever I'm pointing at, 00:05:39.720 --> 00:05:41.760 and any highlighted code 00:05:41.760 --> 00:05:44.560 will also be inserted into a source block, 00:05:44.560 --> 00:05:49.407 and eventually, drop my cursor 00:05:49.407 --> 00:05:52.107 where I can work on it. 00:05:52.107 --> 00:05:55.000 So, we can grab our template, 00:05:55.000 --> 00:05:57.400 and the one thing I'm going to need to add it here 00:05:57.400 --> 00:05:59.360 is to say what file this goes to. 00:05:59.360 --> 00:06:03.760 I'm going to copy the name of this file, 00:06:03.760 --> 00:06:08.040 and put it right in there. 00:06:08.040 --> 00:06:10.680 I'm going to go ahead now run this template. 00:06:10.680 --> 00:06:14.400 Now, we can explore our code. 00:06:14.400 --> 00:06:16.440 For example, I can look in the server, 00:06:16.440 --> 00:06:18.400 and say, "Oh yeah, this slide looks interesting. 00:06:18.400 --> 00:06:21.040 Go ahead and capture that." 00:06:21.040 --> 00:06:23.800 There you see our template. 00:06:23.800 --> 00:06:26.000 You see, yeah, this is Next.js app, 00:06:26.000 --> 00:06:29.320 and you can see it got added right in here 00:06:29.320 --> 00:06:33.080 right next to my other code. 00:06:33.080 --> 00:06:34.640 So, that's interesting. 00:06:34.640 --> 00:06:36.920 I can always go ahead and click that link, 00:06:36.920 --> 00:06:40.560 and get thrown directly to where in the code I was. 00:06:40.560 --> 00:06:43.240 I'm kind of building up my own dashboard 00:06:43.240 --> 00:06:45.040 as I explore this project 00:06:45.040 --> 00:06:49.160 of interesting points within the project. 00:06:49.160 --> 00:06:52.440 One of the things I noticed here 00:06:52.440 --> 00:06:57.440 by looking at the file structure is that 00:06:57.440 --> 00:07:02.040 there is an area for certificates. 00:07:02.040 --> 00:07:05.625 That's a little unusual, so we'll make a note 00:07:05.625 --> 00:07:08.007 of that by again running `org-store-link`. 00:07:08.007 --> 00:07:12.707 This comes with certificates, 00:07:12.707 --> 00:07:18.007 so we'll put that there. 00:07:18.007 --> 00:07:21.607 One of the good standbys is, 00:07:21.607 --> 00:07:23.540 just to use our regular shell commands. 00:07:23.540 --> 00:07:26.774 So, we will go ahead and say, 00:07:26.774 --> 00:07:29.807 the default directory for this is our project. 00:07:29.807 --> 00:07:31.640 And we can go ahead and say, 00:07:31.640 --> 00:07:38.520 `cat certificates/localhost.key`, 00:07:38.520 --> 00:07:43.760 and then we'll output the first five lines of it, 00:07:43.760 --> 00:07:45.848 just to make sure it's a regular certificate. 00:07:45.848 --> 00:07:49.360 Now, notice this got broken up a little bit. 00:07:49.360 --> 00:07:51.720 This is due to Emacs auto formatting. 00:07:51.720 --> 00:07:55.866 We can come in here, and tell it to 00:07:55.866 --> 00:07:57.400 format it as code, 00:07:57.400 --> 00:07:59.880 which will be the same as this block right here. 00:07:59.880 --> 00:08:02.320 Now, there are other options available. 00:08:02.320 --> 00:08:05.453 If, for example, we don't want [it] 00:08:05.453 --> 00:08:06.480 to be a shell block, 00:08:06.480 --> 00:08:09.560 we wanted a Python block for some reason, 00:08:09.560 --> 00:08:15.320 we do `:wrap src python`, and execute that, 00:08:15.320 --> 00:08:18.440 and it's now wrapped as a Python block, 00:08:18.440 --> 00:08:21.480 but I like it as a shell. 00:08:21.480 --> 00:08:24.240 Let's, for example, go down into pages here 00:08:24.240 --> 00:08:25.800 and look at this document file. 00:08:25.800 --> 00:08:29.160 We're saying, "Okay. Well, this looks interesting 00:08:29.160 --> 00:08:32.474 maybe highlight that," and we'll go ahead 00:08:32.474 --> 00:08:36.240 and capture that template 00:08:36.240 --> 00:08:39.400 and say, grab all this code and paste it in here. 00:08:39.400 --> 00:08:42.440 Now, there is a bug at the moment, 00:08:42.440 --> 00:08:46.280 where if you highlight more than one lines of code, 00:08:46.280 --> 00:08:50.760 the link will not work, and that honestly 00:08:50.760 --> 00:08:54.540 might be something I look into fixing. 00:08:54.540 --> 00:08:57.507 One of the things that might be useful here 00:08:57.507 --> 00:08:59.274 would be to check out 00:08:59.274 --> 00:09:02.107 how this file has evolved over time. 00:09:02.107 --> 00:09:05.340 To do that, I'm going to use Magit. 00:09:05.340 --> 00:09:09.640 I'll pull up a log. 00:09:09.640 --> 00:09:11.400 Look, there's only a single change. 00:09:11.400 --> 00:09:13.040 I'm going to run a command 00:09:13.040 --> 00:09:16.840 called `orgit-store-link`, 00:09:16.840 --> 00:09:22.174 and now I can come in here and say, 00:09:22.174 --> 00:09:26.207 "It's only changed once." 00:09:26.207 --> 00:09:30.274 Go ahead and insert that link. 00:09:30.507 --> 00:09:33.340 Now, this file… 00:09:33.340 --> 00:09:32.960 the arguments here are kind of weird, 00:09:35.800 --> 00:09:38.520 and in fact, if I click this, 00:09:38.520 --> 00:09:42.040 it will actually go to the full log of that branch. 00:09:42.040 --> 00:09:45.760 However, we can fix that pretty easily. 00:09:45.760 --> 00:09:49.120 Grab the path of our file, 00:09:49.120 --> 00:09:53.874 and this right here is really just the arguments 00:09:53.874 --> 00:09:56.280 that are passed into the log command. 00:09:56.280 --> 00:09:58.880 So, here we go, we put that in there, 00:09:58.880 --> 00:10:04.960 and there we go. We get the full file history. 00:10:04.960 --> 00:10:09.280 Now, I want to actually build the program. 00:10:09.280 --> 00:10:16.520 So, "Build the app." 00:10:16.520 --> 00:10:18.800 Now, I could of course run it as a shell, right. 00:10:18.800 --> 00:10:22.560 `npm ci`. The problem with that is that 00:10:22.560 --> 00:10:26.400 Emacs is single-threaded. So, if I were to do that, 00:10:26.400 --> 00:10:30.400 the entire time while it was running, 00:10:30.400 --> 00:10:33.120 it would be locking out my Emacs. 00:10:33.120 --> 00:10:35.740 Additionally, I might not actually want 00:10:35.740 --> 00:10:38.707 all that scroll--`npm ci` produces a lot of it-- 00:10:38.707 --> 00:10:40.080 actually in my document. 00:10:40.080 --> 00:10:43.840 So instead, what we could do is 00:10:43.840 --> 00:10:46.800 use an Emacs Lisp function, 00:10:46.800 --> 00:10:49.640 and it's called `async-shell-command`. 00:10:49.640 --> 00:10:52.880 And when you run something in async-shell-command, 00:10:52.880 --> 00:10:58.007 it's going to a comint buffer with a process 00:10:58.007 --> 00:11:00.107 attached to it, and run it in there. 00:11:00.107 --> 00:11:04.907 I will need to set the directory here first, 00:11:04.907 --> 00:11:07.560 and since, again, this is going to be 00:11:07.560 --> 00:11:08.960 opening up in a new buffer. 00:11:08.960 --> 00:11:09.960 I don't need to see that. 00:11:09.960 --> 00:11:11.407 I'm going to run it. 00:11:11.407 --> 00:11:13.680 And what's going to happen is 00:11:13.680 --> 00:11:17.120 this is actually not going to work. 00:11:17.120 --> 00:11:18.160 And it doesn't work, 00:11:18.160 --> 00:11:20.320 Not for any particular reason I can control. 00:11:20.320 --> 00:11:24.880 It's unfortunately that the repo is broken, 00:11:24.880 --> 00:11:26.307 but that is a totally valid 00:11:26.307 --> 00:11:29.040 result of our investigation. 00:11:29.040 --> 00:11:33.107 One of the things that I really love 00:11:33.107 --> 00:11:37.640 to do with Org mode is to actually use it for 00:11:37.640 --> 00:11:38.240 literate programming, 00:11:38.240 --> 00:11:43.080 because Org mode has a pretty capable 00:11:43.080 --> 00:11:46.000 code generation facility built into it. 00:11:46.000 --> 00:11:47.440 It's called tangling. 00:11:47.440 --> 00:11:51.720 So, if I go ahead and take my document... 00:11:51.720 --> 00:11:54.107 This is for a little Arduino project, 00:11:54.107 --> 00:11:56.907 where I was figuring out to spin things around 00:11:56.907 --> 00:12:00.074 using an old Roomba motor. 00:12:00.074 --> 00:12:05.280 I can go ahead and write a script like this, 00:12:05.280 --> 00:12:09.400 and then notice, I use the tangle variable 00:12:09.400 --> 00:12:11.520 that is just going to determine 00:12:11.520 --> 00:12:13.560 where that file gets written 00:12:13.560 --> 00:12:17.680 when we call the command `org-babel-tangle`. 00:12:17.680 --> 00:12:20.080 So, if I go ahead and run this, 00:12:20.080 --> 00:12:21.800 you can see down in the minibuffer, 00:12:21.800 --> 00:12:23.040 it's going to write to 00:12:23.040 --> 00:12:26.707 `/tmp/go-batsy-playground/go-batsy-playground.ino`. 00:12:26.707 --> 00:12:27.840 That's where this right here would write, 00:12:29.240 --> 00:12:33.480 and then I could run commands on it. 00:12:33.480 --> 00:12:36.574 Then I want to start being able to use this 00:12:36.574 --> 00:12:38.600 to build out a program. 00:12:38.600 --> 00:12:42.000 I'm going ahead and writing in prose 00:12:42.000 --> 00:12:43.440 and interspersing it with code. 00:12:43.440 --> 00:12:47.160 So, it's the inverse of code, 00:12:47.160 --> 00:12:49.374 in which you intersperse comments, [here] 00:12:49.374 --> 00:12:51.640 you write prose, and then you intersperse code 00:12:51.640 --> 00:12:54.920 where as needed. 00:12:54.920 --> 00:12:58.120 Tangle is implicitly defined up at the higher level 00:12:58.120 --> 00:12:59.640 in this property block right here, 00:12:59.640 --> 00:13:02.600 which I will talk about in a little bit. 00:13:02.600 --> 00:13:04.720 But if you want to see what properties 00:13:04.720 --> 00:13:07.400 are available at any given time, 00:13:07.400 --> 00:13:10.140 you can hit `org-babel-view-src-block-info` 00:13:10.140 --> 00:13:14.274 right there, and you can see that tangle is enabled. 00:13:14.274 --> 00:13:16.440 All of these blocks have the exact same tangle. 00:13:16.440 --> 00:13:20.800 If I run and see what it is, it's just going to 00:13:20.800 --> 00:13:23.680 write to this directory to `go-batsy.ino`. 00:13:23.680 --> 00:13:28.920 `org-babel-tangle` is going to go ahead 00:13:28.920 --> 00:13:30.640 and tangle all these source code blocks, 00:13:30.640 --> 00:13:33.174 and I can go ahead and look at my file 00:13:33.174 --> 00:13:34.440 and here it is. 00:13:34.440 --> 00:13:36.240 This is the full Arduino file 00:13:36.240 --> 00:13:37.360 that was generated from there. 00:13:37.360 --> 00:13:40.807 I start writing code here, 00:13:40.807 --> 00:13:43.320 and I'm basically doing it in a prose way. 00:13:43.320 --> 00:13:44.640 As I'm thinking about it, 00:13:44.640 --> 00:13:46.080 I write down what I'm going to do. 00:13:46.080 --> 00:13:49.240 Now these braces, we haven't seen these before. 00:13:49.240 --> 00:13:50.440 This is an aspect of Org called `noweb`, 00:13:52.680 --> 00:13:55.374 which again is not too much of a 00:13:55.374 --> 00:13:56.400 templating system too. 00:13:56.400 --> 00:13:58.960 But it does one thing, which is insert code, 00:13:58.960 --> 00:14:00.200 which turns out to be enough. 00:14:00.200 --> 00:14:03.640 So, this right here basically says, 00:14:03.640 --> 00:14:08.507 take that block with that exact name 00:14:08.507 --> 00:14:09.960 and just insert here. 00:14:09.960 --> 00:14:13.760 If you want to see exactly what a block expands to, 00:14:13.760 --> 00:14:15.160 you're going to come in here. 00:14:15.160 --> 00:14:18.320 You're going to run `org-babel-expand-src-block`, 00:14:18.320 --> 00:14:21.000 and there we go. That's what this block expands to. 00:14:21.000 --> 00:14:22.080 That's what all those places 00:14:22.080 --> 00:14:24.807 of this little bits and pieces expand to. 00:14:24.807 --> 00:14:26.120 So, that becomes really useful, and notice 00:14:28.120 --> 00:14:29.960 basically we just take these little blocks 00:14:29.960 --> 00:14:32.520 that are not going to be tangled directly 00:14:32.520 --> 00:14:33.920 but it will be in this other block. 00:14:33.920 --> 00:14:38.074 And we turn off their tangling. 00:14:38.074 --> 00:14:40.680 Now that you have some sort of tangling, 00:14:40.680 --> 00:14:42.880 you want to be able to interact with those files 00:14:42.880 --> 00:14:46.707 that are written to that directory. 00:14:46.707 --> 00:14:48.960 So, right here I have an area 00:14:48.960 --> 00:14:52.760 where I can do things like run a compiler. 00:14:52.760 --> 00:14:55.160 Now what does that compiler do? 00:14:55.160 --> 00:14:57.840 Well, this right here references 00:14:57.841 --> 00:15:01.874 a source code block that appears in another Org file. 00:15:01.874 --> 00:15:04.520 And I find that when doing these sort of things 00:15:04.520 --> 00:15:06.007 it can be useful to have a little 00:15:06.007 --> 00:15:08.000 utility Org directory. 00:15:08.000 --> 00:15:10.374 So, here it is, `org/ci.org`. 00:15:10.374 --> 00:15:11.640 This is just part of my repo. 00:15:11.640 --> 00:15:14.140 We open up, and here we go. 00:15:14.140 --> 00:15:15.200 I have a compile function. 00:15:15.200 --> 00:15:18.360 Basically, it's doing some stuff 00:15:18.360 --> 00:15:20.480 to clean up things correctly. 00:15:20.480 --> 00:15:23.520 But then using that same `async-shell-command` 00:15:23.520 --> 00:15:26.280 to open things up and a new buffer. 00:15:26.280 --> 00:15:28.674 In this case, named after 00:15:28.674 --> 00:15:31.200 whatever heading it was under. 00:15:31.200 --> 00:15:35.160 And then we're going to go ahead and inside of it 00:15:35.160 --> 00:15:39.874 run Arduino CLI command to compile, 00:15:39.874 --> 00:15:43.560 and pass that into `watchexec`. 00:15:43.560 --> 00:15:46.120 which is a little Rust program 00:15:46.120 --> 00:15:49.520 that watches inode[??] files for any changes, 00:15:49.520 --> 00:15:51.240 and when they detect them, we will run this. 00:15:51.240 --> 00:15:56.160 If I were to, for example, add a line here, 00:15:56.160 --> 00:15:59.360 and now run `org-babel-tangle`, 00:15:59.360 --> 00:16:02.400 you can see watchexec immediately 00:16:02.400 --> 00:16:04.480 picks it up and restarts it. 00:16:04.480 --> 00:16:07.474 Now it's kind of a pain to remember 00:16:07.475 --> 00:16:09.680 to run `org-babel-tangle` all the time. 00:16:09.680 --> 00:16:13.807 So, I can come here and click this button. 00:16:13.807 --> 00:16:17.040 It asks me to execute it there. 00:16:17.040 --> 00:16:18.280 And what does that do? 00:16:18.280 --> 00:16:23.280 Here you go. It's just a very simple hyperlink, 00:16:23.280 --> 00:16:25.600 but to the Elisp protocol. 00:16:25.600 --> 00:16:30.600 The Elisp protocol just adds a hook that says, 00:16:30.600 --> 00:16:35.107 whenever a document is saved, run `org-babel-tangle`. 00:16:35.107 --> 00:16:37.600 And now that I've run that, I can go ahead, 00:16:37.600 --> 00:16:39.307 come in here, and delete that. 00:16:39.307 --> 00:16:42.340 And look at that. It tangles automatically for me. 00:16:42.340 --> 00:16:45.040 Because I don't want to actually have this 00:16:45.040 --> 00:16:49.480 playground script tangle to my real file, 00:16:49.480 --> 00:16:51.440 I need this concept of 00:16:51.440 --> 00:16:52.760 some sort of workspace directory. 00:16:52.760 --> 00:16:54.880 And a workspace directory 00:16:54.880 --> 00:16:58.280 what I really want is a variable that is tied to 00:16:58.280 --> 00:17:02.674 where in my document hierarchy this appears. 00:17:02.674 --> 00:17:06.680 I want a dynamically scoped variable 00:17:06.680 --> 00:17:08.240 that's scoped to my document. 00:17:08.240 --> 00:17:12.560 And you can do that. For example, in this case, 00:17:12.560 --> 00:17:15.280 I have in my properties 00:17:15.280 --> 00:17:20.080 a key value declared `workspace-directory`, 00:17:20.080 --> 00:17:22.080 [it] goes into a temp directory. 00:17:22.080 --> 00:17:24.480 And here, by running `org-get-entry` 00:17:24.480 --> 00:17:25.800 starting at the current point, 00:17:25.800 --> 00:17:27.507 find `workspace-directory` 00:17:27.507 --> 00:17:28.760 with a second parameter 1. 00:17:28.760 --> 00:17:31.520 You can see down in the minibuffer, 00:17:31.520 --> 00:17:37.174 goes to `/tmp/go-batsy-playground/`. 00:17:37.174 --> 00:17:39.720 This right here is going to override 00:17:42.040 --> 00:17:44.307 the `workspace-directory` at the top level, 00:17:44.307 --> 00:17:47.607 which is dot. Dot means here. 00:17:47.607 --> 00:17:48.880 That's what makes sure 00:17:48.880 --> 00:17:50.680 that the rest of these tangle to 00:17:50.680 --> 00:17:54.560 that go-batsy file right relevant to here. 00:17:54.560 --> 00:17:55.740 And that does mean that we need 00:17:55.740 --> 00:17:58.207 a little bit more complex thing here. 00:17:58.207 --> 00:18:01.760 So, we're saying go ahead and `org-entry-get` 00:18:01.760 --> 00:18:04.800 the `workspace-directory`. 00:18:04.800 --> 00:18:06.807 If anyone hasn't seen this syntax, 00:18:06.807 --> 00:18:16.040 this dash arrow is from the dash.el library, 00:18:16.040 --> 00:18:19.240 which is basically a big library of all 00:18:19.240 --> 00:18:20.940 the utility functions that you wish 00:18:20.940 --> 00:18:22.880 Emacs Lisp had. They're well-named. 00:18:22.880 --> 00:18:24.480 I highly, highly recommend it. 00:18:24.480 --> 00:18:26.080 This is the threading operator. 00:18:26.080 --> 00:18:28.200 So, we're just basically taking it, 00:18:28.200 --> 00:18:29.760 getting the `workspace-directory`, 00:18:29.760 --> 00:18:32.307 if it happens to be dot, then we're just going to 00:18:32.307 --> 00:18:33.320 return the current directory, 00:18:33.320 --> 00:18:36.000 otherwise whatever directory said. 00:18:36.000 --> 00:18:39.240 And then I want to just take a moment 00:18:39.240 --> 00:18:41.280 and look at the rest of this structure. 00:18:41.280 --> 00:18:43.080 So, `workspace-directory` we talked about. 00:18:43.080 --> 00:18:46.774 `header-args` if you noticed, none of my 00:18:46.774 --> 00:18:48.707 code blocks for the most part 00:18:48.707 --> 00:18:50.840 have any header arguments. 00:18:50.840 --> 00:18:53.174 You can drop the `header-args` property, 00:18:53.174 --> 00:18:55.607 which is going to be header arguments 00:18:55.607 --> 00:18:57.840 that are added automatically 00:18:57.840 --> 00:19:03.407 to all source code blocks under this heading. 00:19:03.407 --> 00:19:05.407 `header-args+`. Well, 00:19:05.407 --> 00:19:06.540 sometimes you don't want to type… 00:19:06.540 --> 00:19:07.507 you have a bunch of args, 00:19:07.507 --> 00:19:08.240 you don't want to type them out 00:19:08.240 --> 00:19:09.440 in this one big line. 00:19:09.440 --> 00:19:11.040 So, you basically are adding a new header-arg 00:19:13.320 --> 00:19:15.407 to the existing list of header. 00:19:15.407 --> 00:19:18.160 And then you can have header-args that are specific 00:19:18.160 --> 00:19:20.440 to certain languages, like, for example, 00:19:20.440 --> 00:19:21.560 this `default-directory` var is going to be set 00:19:23.720 --> 00:19:25.200 for all Emacs Lisps. 00:19:25.200 --> 00:19:29.574 And for all Arduinos, evaluation will be disabled, 00:19:29.574 --> 00:19:32.440 and tangling will be automatically enabled. 00:19:32.440 --> 00:19:35.307 These are just some of the workflows that become 00:19:35.307 --> 00:19:38.320 useful when you're actually doing the coding. 00:19:38.320 --> 00:19:41.374 [Future George]: Oh, hello again! 00:19:41.374 --> 00:19:45.307 Me from the six months from now. 00:19:45.307 --> 00:19:49.107 [George]: Cool. 00:19:49.107 --> 00:19:51.000 [Future George]: The talk got over, people liked it, 00:19:51.000 --> 00:19:53.040 thought the pacing was all over the place. 00:19:53.040 --> 00:19:56.360 [George]: Yeah, I had to cut two thirds of it, 00:19:56.360 --> 00:19:59.800 going to be filling in those gaps in the Etherpad. 00:19:59.800 --> 00:20:03.520 [Future George]: And the editing was uneven, at best. 00:20:03.520 --> 00:20:05.507 [George]: I got way better at it 00:20:05.507 --> 00:20:06.680 as I worked on it, didn't I? 00:20:06.680 --> 00:20:09.960 Kdenlive is pretty cool. 00:20:09.960 --> 00:20:13.540 But yeah, I wanted to take a shot at 00:20:13.540 --> 00:20:16.040 something different, and I figured if anyone can 00:20:16.040 --> 00:20:17.760 appreciate trying something different, 00:20:17.760 --> 00:20:20.120 it's EmacsConf, right? 00:20:20.120 --> 00:20:21.520 I hope people found it useful. 00:20:21.520 --> 00:20:22.600 [Future George]: Yeah, some did. 00:20:22.600 --> 00:20:26.920 Oh, I should tell you about the coming Orca war.