summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt43
-rw-r--r--2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt826
-rw-r--r--2022/info/justl-after.md282
-rw-r--r--2022/info/justl-before.md28
4 files changed, 1177 insertions, 2 deletions
diff --git a/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt b/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt
new file mode 100644
index 00000000..836e8d54
--- /dev/null
+++ b/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt
@@ -0,0 +1,43 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:39.320
+Introduction
+
+00:00:39.320 --> 00:01:48.520
+Justfiles
+
+00:01:48.520 --> 00:02:27.680
+Executing recipes
+
+00:02:27.680 --> 00:02:56.440
+Other features
+
+00:02:56.440 --> 00:04:19.280
+Comparison with Makefiles
+
+00:04:19.280 --> 00:04:52.400
+justl.el
+
+00:04:52.400 --> 00:06:17.280
+Executing recipes in Emacs
+
+00:06:17.280 --> 00:06:36.600
+Options
+
+00:06:36.600 --> 00:06:57.320
+Eshell
+
+00:06:57.320 --> 00:07:15.520
+Going to the recipe line
+
+00:07:15.520 --> 00:07:39.560
+Re-executing recipes
+
+00:07:39.560 --> 00:08:56.600
+Example
+
+00:08:56.600 --> 00:09:34.680
+justl-exec-recipe-in-dir
+
+00:09:34.680 --> 00:10:02.040
+End
diff --git a/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt b/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt
new file mode 100644
index 00000000..cd239aa8
--- /dev/null
+++ b/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt
@@ -0,0 +1,826 @@
+WEBVTT captioned by sachac
+
+00:00:00.000 --> 00:00:04.240
+Hi everyone, I am Sibi Prabakaran
+
+00:00:04.240 --> 00:00:09.560
+and welcome to my session on Justl Emacs Mode.
+
+00:00:09.560 --> 00:00:11.640
+A bit about me, I have been working
+
+00:00:11.640 --> 00:00:12.880
+as a Haskell Engineer
+
+00:00:12.880 --> 00:00:15.600
+at FPComplete for the last 4 years.
+
+00:00:15.600 --> 00:00:17.400
+I am based out of India.
+
+00:00:17.400 --> 00:00:20.680
+I occasionally blog at my website psibi.in
+
+00:00:20.680 --> 00:00:23.560
+where you can find more information about me.
+
+00:00:23.560 --> 00:00:25.000
+I have been using Emacs
+
+00:00:25.000 --> 00:00:26.920
+for more than a decade now.
+
+00:00:26.920 --> 00:00:28.160
+I help in the maintenance
+
+00:00:28.160 --> 00:00:31.080
+of the Terraform client for LSP mode.
+
+00:00:31.080 --> 00:00:33.960
+I have also authored dhall-mode and rego-mode
+
+00:00:33.960 --> 00:00:35.000
+which are the major modes
+
+00:00:35.000 --> 00:00:39.320
+for the respective languages.
+
+00:00:39.320 --> 00:00:40.680
+Before jumping into the demo
+
+00:00:40.680 --> 00:00:42.040
+of the Emacs package,
+
+00:00:42.040 --> 00:00:44.160
+I would like to give a brief introduction
+
+00:00:44.160 --> 00:00:46.280
+about justfiles and what it is.
+
+00:00:46.280 --> 00:00:49.000
+I will also try to compare it with Makefiles
+
+00:00:49.000 --> 00:00:53.640
+as it takes a lot of inspiration from it.
+
+00:00:53.640 --> 00:00:55.640
+What you see currently in the buffer
+
+00:00:55.640 --> 00:00:57.320
+is a sample justfile.
+
+00:00:57.320 --> 00:00:59.480
+If you have previously used Makefiles,
+
+00:00:59.480 --> 00:01:00.480
+you would be able to see
+
+00:01:00.480 --> 00:01:02.280
+that there is quite a bit of similarity
+
+00:01:02.280 --> 00:01:03.560
+between them.
+
+00:01:03.560 --> 00:01:05.080
+Anything that starts with hash
+
+00:01:05.080 --> 00:01:07.120
+is a documentation comment.
+
+00:01:07.120 --> 00:01:09.160
+You can see that I have the first recipe
+
+00:01:09.160 --> 00:01:10.920
+which is named as default.
+
+00:01:10.920 --> 00:01:12.520
+So if you run the just executable
+
+00:01:12.520 --> 00:01:14.120
+without any arguments,
+
+00:01:14.120 --> 00:01:15.400
+by default it is going to run
+
+00:01:15.400 --> 00:01:17.200
+the first recipe.
+
+00:01:17.200 --> 00:01:18.440
+This recipe's definition
+
+00:01:18.440 --> 00:01:20.080
+calls the just command
+
+00:01:20.080 --> 00:01:21.920
+in turn, with the two arguments,
+
+00:01:21.920 --> 00:01:24.080
+namely --list and --unsorted,
+
+00:01:24.080 --> 00:01:25.680
+which basically asks just
+
+00:01:25.680 --> 00:01:27.800
+to list down all the recipes
+
+00:01:27.800 --> 00:01:29.680
+in an unsorted order.
+
+00:01:29.680 --> 00:01:32.400
+Each line of each recipe is executed
+
+00:01:32.400 --> 00:01:33.920
+by a fresh shell.
+
+00:01:33.920 --> 00:01:35.120
+That pretty much
+
+00:01:35.120 --> 00:01:36.360
+is the high level overview
+
+00:01:36.360 --> 00:01:38.520
+of getting started to use this tool.
+
+00:01:38.520 --> 00:01:40.760
+This tool assumes the presence of a shell
+
+00:01:40.760 --> 00:01:43.480
+which is bash in most GNU/Linux systems,
+
+00:01:43.480 --> 00:01:44.840
+but you can configure it
+
+00:01:44.840 --> 00:01:47.160
+to explicitly use any specific shell
+
+00:01:47.160 --> 00:01:48.520
+you have in mind.
+
+00:01:48.520 --> 00:01:50.480
+Let me in fact go and try executing
+
+00:01:50.480 --> 00:01:52.600
+the first recipe.
+
+00:01:52.600 --> 00:01:53.760
+I will first execute it
+
+00:01:53.760 --> 00:01:55.160
+without any arguments,
+
+00:01:55.160 --> 00:01:59.000
+which will force it to run the first recipe.
+
+00:01:59.000 --> 00:02:01.800
+As you can see, it listed all the recipes.
+
+00:02:01.800 --> 00:02:03.200
+Now I can actually execute
+
+00:02:03.200 --> 00:02:04.200
+a particular recipe
+
+00:02:04.200 --> 00:02:06.640
+by passing an explicit recipe name.
+
+00:02:06.640 --> 00:02:08.400
+Let me execute the hello recipe now
+
+00:02:08.400 --> 00:02:11.920
+which will basically print "hello world".
+
+00:02:11.920 --> 00:02:15.320
+It works as expected.
+
+00:02:15.320 --> 00:02:17.040
+As you can see, that's all that's required
+
+00:02:17.040 --> 00:02:18.600
+to get started with this tool.
+
+00:02:18.600 --> 00:02:20.348
+You create a file named justfile
+
+00:02:20.349 --> 00:02:22.800
+in a directory, define some recipes
+
+00:02:22.800 --> 00:02:23.640
+and then run them
+
+00:02:23.640 --> 00:02:27.680
+via the just executable.
+
+00:02:27.680 --> 00:02:28.440
+Note that there are
+
+00:02:28.440 --> 00:02:30.680
+various other features in justfile.
+
+00:02:30.680 --> 00:02:32.240
+You can define variables,
+
+00:02:32.240 --> 00:02:33.280
+mark some variables
+
+00:02:33.280 --> 00:02:35.520
+to be exported as environment variables,
+
+00:02:35.520 --> 00:02:37.280
+have optional parameters
+
+00:02:37.280 --> 00:02:38.800
+that can be passed to a recipe.
+
+00:02:38.800 --> 00:02:40.960
+You can also set up dependency
+
+00:02:40.960 --> 00:02:42.480
+between recipes
+
+00:02:42.480 --> 00:02:44.920
+and also write scripts within a recipe
+
+00:02:44.920 --> 00:02:46.800
+in a language of your choice.
+
+00:02:46.800 --> 00:02:48.560
+I won't be going into the details,
+
+00:02:48.560 --> 00:02:50.120
+but I encourage you to go through
+
+00:02:50.120 --> 00:02:51.640
+the very helpful manual page
+
+00:02:51.640 --> 00:02:56.440
+to learn more about it.
+
+00:02:56.440 --> 00:02:59.200
+Also, let me compare it with Makefiles.
+
+00:02:59.200 --> 00:03:00.800
+I do think it's kind of unfair
+
+00:03:00.800 --> 00:03:02.160
+to compare both the tools
+
+00:03:02.160 --> 00:03:04.760
+since make is a build automation tool
+
+00:03:04.760 --> 00:03:07.520
+whereas just's goal is a task runner,
+
+00:03:07.520 --> 00:03:09.320
+and since just doesn't try to be
+
+00:03:09.320 --> 00:03:10.440
+a build system,
+
+00:03:10.440 --> 00:03:12.480
+it can avoid the associated complexity
+
+00:03:12.480 --> 00:03:15.080
+that comes with the tool like make.
+
+00:03:15.080 --> 00:03:17.040
+There is one nice historical fact
+
+00:03:17.040 --> 00:03:18.200
+about just.
+
+00:03:18.200 --> 00:03:19.560
+The initial version of just
+
+00:03:19.560 --> 00:03:21.640
+relied on make command being available,
+
+00:03:21.640 --> 00:03:23.360
+so it was basically
+
+00:03:23.360 --> 00:03:25.440
+a glorified wrapper around it.
+
+00:03:25.440 --> 00:03:26.440
+But it was removed,
+
+00:03:26.440 --> 00:03:27.760
+and justfile doesn't have
+
+00:03:27.760 --> 00:03:29.680
+that dependency anymore.
+
+00:03:29.680 --> 00:03:31.680
+If you are using make as a task runner
+
+00:03:31.680 --> 00:03:33.400
+then you would have to use
+
+00:03:33.400 --> 00:03:35.400
+something called phony targets.
+
+00:03:35.400 --> 00:03:37.240
+I don't want to go into the details,
+
+00:03:37.240 --> 00:03:39.240
+but makefiles have good reason
+
+00:03:39.240 --> 00:03:41.040
+for why they need something like that.
+
+00:03:41.040 --> 00:03:44.080
+Since justfile is not a build system,
+
+00:03:44.080 --> 00:03:45.200
+it doesn't have to deal with them.
+
+00:03:45.200 --> 00:03:47.400
+The error message
+
+00:03:47.400 --> 00:03:48.680
+and user experience of this tool,
+
+00:03:48.680 --> 00:03:50.480
+in my opinion, is better.
+
+00:03:50.480 --> 00:03:52.760
+To show you a concrete example,
+
+00:03:52.760 --> 00:03:54.920
+justfile errors out by default
+
+00:03:54.920 --> 00:03:56.400
+if you have duplicate recipes.
+
+00:03:56.400 --> 00:03:58.840
+This is in contrast with make
+
+00:03:58.840 --> 00:04:00.720
+where I believe it prints out
+
+00:04:00.720 --> 00:04:01.760
+a warning about it,
+
+00:04:01.760 --> 00:04:03.840
+but still executes the target action.
+
+00:04:03.840 --> 00:04:06.600
+Justfile also gives you the ability
+
+00:04:06.600 --> 00:04:08.200
+to easily create scripts
+
+00:04:08.200 --> 00:04:10.680
+written in any language within a recipe.
+
+00:04:10.680 --> 00:04:12.680
+My personal opinion is that
+
+00:04:12.680 --> 00:04:14.200
+if you are using makefile
+
+00:04:14.200 --> 00:04:15.200
+as a task runner,
+
+00:04:15.200 --> 00:04:17.440
+you might want to check out justfile
+
+00:04:17.440 --> 00:04:19.280
+to see if it will suit your workflow.
+
+00:04:19.280 --> 00:04:25.000
+With that, I'll move on to justl.el,
+
+00:04:25.000 --> 00:04:26.800
+which is basically an Emacs package
+
+00:04:26.800 --> 00:04:28.120
+for driving justfiles.
+
+00:04:28.120 --> 00:04:29.920
+I started writing this tool
+
+00:04:29.920 --> 00:04:31.200
+around a year ago
+
+00:04:31.200 --> 00:04:33.720
+when my usage of justfile increased.
+
+00:04:33.720 --> 00:04:35.440
+The objective of the tool
+
+00:04:35.440 --> 00:04:37.480
+is to reduce the usage of the CLI
+
+00:04:37.480 --> 00:04:40.040
+and drive the execution of the recipes
+
+00:04:40.040 --> 00:04:41.480
+natively within the editor.
+
+00:04:41.480 --> 00:04:44.000
+Let me take you back to the justfile
+
+00:04:44.000 --> 00:04:45.240
+which we saw previously.
+
+00:04:45.240 --> 00:04:47.320
+This time we will drive it
+
+00:04:47.320 --> 00:04:48.840
+within the editor itself,
+
+00:04:48.840 --> 00:04:51.400
+instead of executing commands via vterm
+
+00:04:51.400 --> 00:04:52.400
+as done previously.
+
+00:04:52.400 --> 00:04:54.640
+So the idea is you either
+
+00:04:54.640 --> 00:04:56.000
+open the justfile,
+
+00:04:56.000 --> 00:04:57.840
+or any other file in the directory.
+
+00:04:57.840 --> 00:04:59.160
+That doesn't matter, actually.
+
+00:04:59.160 --> 00:05:00.720
+Once you do that,
+
+00:05:00.720 --> 00:05:02.360
+you call the justl command.
+
+00:05:02.360 --> 00:05:06.640
+Now as you can see, it lists down
+
+00:05:06.640 --> 00:05:07.520
+all the recipes,
+
+00:05:07.520 --> 00:05:09.280
+along with the description if present.
+
+00:05:09.280 --> 00:05:11.520
+You can move on to different recipes
+
+00:05:11.520 --> 00:05:13.080
+by your usual keybinding.
+
+00:05:13.080 --> 00:05:15.680
+And for executing a specific recipe,
+
+00:05:15.680 --> 00:05:18.240
+you have to press the e keybinding,
+
+00:05:18.240 --> 00:05:19.720
+and that will run the recipe
+
+00:05:19.720 --> 00:05:21.600
+and show its output
+
+00:05:21.600 --> 00:05:23.400
+on a special buffer named *just*
+
+00:05:23.400 --> 00:05:25.000
+which is built on top of
+
+00:05:25.000 --> 00:05:27.040
+the compilation mode available in Emacs.
+
+00:05:27.040 --> 00:05:28.760
+Let me actually try
+
+00:05:28.760 --> 00:05:30.240
+executing the hello recipe
+
+00:05:30.240 --> 00:05:32.440
+which we previously executed in vterm.
+
+00:05:32.440 --> 00:05:38.160
+As you can see,
+
+00:05:38.160 --> 00:05:39.680
+it executed the recipe
+
+00:05:39.680 --> 00:05:41.120
+and the "hello world" output
+
+00:05:41.120 --> 00:05:42.400
+is visible in the just buffer.
+
+00:05:42.400 --> 00:05:44.400
+You can also see that there is
+
+00:05:44.400 --> 00:05:45.880
+other metadata like
+
+00:05:45.880 --> 00:05:47.480
+when it started executing
+
+00:05:47.480 --> 00:05:49.520
+and when did it finish executing.
+
+00:05:49.520 --> 00:05:51.520
+If a recipe execution fails,
+
+00:05:51.520 --> 00:05:53.160
+it will also change the color
+
+00:05:53.160 --> 00:05:55.760
+and print the corresponding exit code.
+
+00:05:55.760 --> 00:05:57.320
+Let me actually show you
+
+00:05:57.320 --> 00:05:59.080
+by modifying the hello recipe
+
+00:05:59.080 --> 00:06:03.600
+and making it exit.
+
+00:06:03.600 --> 00:06:08.400
+As you can see,
+
+00:06:08.400 --> 00:06:10.480
+it clearly indicates the error message now.
+
+00:06:10.480 --> 00:06:12.720
+That is a pretty much
+
+00:06:12.720 --> 00:06:14.240
+a good high level overview
+
+00:06:14.240 --> 00:06:15.680
+of how to execute recipes
+
+00:06:15.680 --> 00:06:17.280
+using this Emacs extension.
+
+00:06:17.280 --> 00:06:21.720
+If I press the h or the ? key,
+
+00:06:21.720 --> 00:06:23.520
+it will display the various ways
+
+00:06:23.520 --> 00:06:24.160
+to drive it.
+
+00:06:24.160 --> 00:06:27.480
+Now as you can see,
+
+00:06:27.480 --> 00:06:29.320
+you can pass various options to it.
+
+00:06:29.320 --> 00:06:31.600
+I find the dry run option effective
+
+00:06:31.600 --> 00:06:34.560
+whenever I have to print the recipe contents
+
+00:06:34.560 --> 00:06:36.600
+without actually executing the recipe.
+
+00:06:36.600 --> 00:06:39.720
+There are also various ways to execute it.
+
+00:06:39.720 --> 00:06:42.960
+You can use Emacs's eshell to execute it
+
+00:06:42.960 --> 00:06:45.040
+by pressing the E keybinding.
+
+00:06:45.040 --> 00:06:48.400
+Let me try executing the hello recipe again,
+
+00:06:48.400 --> 00:06:50.760
+but this time via Emacs's eshell.
+
+00:06:50.760 --> 00:06:54.840
+As you can see now I have an eshell instance
+
+00:06:54.840 --> 00:06:57.320
+where it executed the just hello recipe.
+
+00:06:57.320 --> 00:07:02.440
+You can also directly
+
+00:07:02.440 --> 00:07:03.680
+go to the recipe line
+
+00:07:03.680 --> 00:07:05.000
+by pressing the return key.
+
+00:07:05.000 --> 00:07:08.040
+So let's say if I want to
+
+00:07:08.040 --> 00:07:09.360
+go to the recipe build app
+
+00:07:09.360 --> 00:07:12.160
+all I have to do is press the return key
+
+00:07:12.160 --> 00:07:14.400
+and it will go to the just file
+
+00:07:14.400 --> 00:07:15.520
+with the proper line.
+
+00:07:15.520 --> 00:07:19.800
+You can also re-execute the same recipe
+
+00:07:19.800 --> 00:07:21.320
+from the output just buffer.
+
+00:07:21.320 --> 00:07:23.320
+I find this very helpful
+
+00:07:23.320 --> 00:07:25.080
+when iterating on certain things.
+
+00:07:25.080 --> 00:07:26.720
+In my day job,
+
+00:07:26.720 --> 00:07:29.240
+I often have to work with a Kubernetes cluster,
+
+00:07:29.240 --> 00:07:30.480
+and I would have to write
+
+00:07:30.480 --> 00:07:33.360
+resource manifest files for applications.
+
+00:07:33.360 --> 00:07:36.376
+Having the ability to run the recipes
+
+00:07:36.377 --> 00:07:37.942
+while iterating on the project
+
+00:07:37.943 --> 00:07:39.560
+is very useful, in my opinion.
+
+00:07:39.560 --> 00:07:42.000
+Let me actually show you
+
+00:07:42.000 --> 00:07:43.680
+an example of what I am talking about.
+
+00:07:43.680 --> 00:07:46.680
+Let me run the build app recipe now,
+
+00:07:46.680 --> 00:07:48.400
+which will basically build the manifest
+
+00:07:48.400 --> 00:07:49.600
+and print it out.
+
+00:07:49.600 --> 00:07:58.160
+Now let me open one of the application files.
+
+00:07:58.160 --> 00:07:59.960
+I will open the ingress.yaml file.
+
+00:07:59.960 --> 00:08:06.120
+So I have this YAML file which I am working on,
+
+00:08:06.120 --> 00:08:08.600
+and I also have this output buffer
+
+00:08:08.600 --> 00:08:10.160
+which is basically the output
+
+00:08:10.160 --> 00:08:11.840
+of the build app recipe.
+
+00:08:11.840 --> 00:08:14.200
+Now I can basically go through this buffer
+
+00:08:14.200 --> 00:08:18.320
+and see if everything is alright,
+
+00:08:18.320 --> 00:08:21.760
+but I find out that I didn't want
+
+00:08:21.760 --> 00:08:23.920
+the hostname to be emacs2022.
+
+00:08:23.920 --> 00:08:25.840
+I wanted it to be just emacs.
+
+00:08:25.840 --> 00:08:29.000
+I can go and fix it in my YAML file,
+
+00:08:29.000 --> 00:08:34.160
+and then I can go on
+
+00:08:34.160 --> 00:08:36.160
+to the output buffer
+
+00:08:36.160 --> 00:08:38.520
+and basically just re-run the command
+
+00:08:38.520 --> 00:08:40.080
+by pressing the g key binding.
+
+00:08:40.080 --> 00:08:42.800
+As you can see,
+
+00:08:42.800 --> 00:08:48.160
+it executed the same recipe again,
+
+00:08:48.160 --> 00:08:49.440
+and I can see that
+
+00:08:49.440 --> 00:08:51.280
+the hostname is indeed emacs.
+
+00:08:51.280 --> 00:08:55.000
+I find this kind of workflow very convenient
+
+00:08:55.000 --> 00:08:56.600
+while I am working on a project.
+
+00:08:56.600 --> 00:08:59.320
+Another way of interacting
+
+00:08:59.320 --> 00:09:00.440
+with the justl extension
+
+00:09:00.440 --> 00:09:02.400
+is by using the interactive function
+
+00:09:02.400 --> 00:09:04.280
+justl-exec-recipe-in-dir.
+
+00:09:04.280 --> 00:09:06.040
+The use case of this function
+
+00:09:06.040 --> 00:09:07.840
+is executing a one-off recipe
+
+00:09:07.840 --> 00:09:09.920
+while you are working on something else.
+
+00:09:09.920 --> 00:09:11.960
+Let me show you an example of it.
+
+00:09:11.960 --> 00:09:19.800
+As you can see, it shows me
+
+00:09:19.800 --> 00:09:21.320
+a drop down of various recipes
+
+00:09:21.320 --> 00:09:22.640
+available in the justfile.
+
+00:09:22.640 --> 00:09:24.880
+You can choose any particular one
+
+00:09:24.880 --> 00:09:26.800
+and execute the corresponding recipe.
+
+00:09:26.800 --> 00:09:28.360
+In this case, I will choose
+
+00:09:28.360 --> 00:09:29.640
+the build-app recipe,
+
+00:09:29.640 --> 00:09:31.320
+and we will get the output
+
+00:09:31.320 --> 00:09:32.280
+in the *just* buffer
+
+00:09:32.280 --> 00:09:33.200
+which should be similar
+
+00:09:33.200 --> 00:09:34.680
+to what we saw previously.
+
+00:09:34.680 --> 00:09:43.920
+So this was a quick introduction
+
+00:09:43.920 --> 00:09:45.120
+to what justfile is
+
+00:09:45.120 --> 00:09:46.800
+and how to drive them within Emacs.
+
+00:09:46.800 --> 00:09:48.600
+Hopefully it was helpful
+
+00:09:48.600 --> 00:09:50.160
+and it would encourage you
+
+00:09:50.160 --> 00:09:51.480
+to use justfiles in your workflow.
+
+00:09:51.480 --> 00:09:53.800
+Thank you for allowing me to present.
+
+00:09:53.800 --> 00:09:55.480
+I am available in IRC
+
+00:09:55.480 --> 00:10:02.040
+if you have any questions.
diff --git a/2022/info/justl-after.md b/2022/info/justl-after.md
index 5848ca22..f13e021b 100644
--- a/2022/info/justl-after.md
+++ b/2022/info/justl-after.md
@@ -1,6 +1,288 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="justl-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hi everyone, I am Sibi Prabakaran""" start="00:00:00.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and welcome to my session on Justl Emacs Mode.""" start="00:00:04.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""A bit about me, I have been working""" start="00:00:09.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""as a Haskell Engineer""" start="00:00:11.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""at FPComplete for the last 4 years.""" start="00:00:12.880" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I am based out of India.""" start="00:00:15.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I occasionally blog at my website psibi.in""" start="00:00:17.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""where you can find more information about me.""" start="00:00:20.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I have been using Emacs""" start="00:00:23.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""for more than a decade now.""" start="00:00:25.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I help in the maintenance""" start="00:00:26.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""of the Terraform client for LSP mode.""" start="00:00:28.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I have also authored dhall-mode and rego-mode""" start="00:00:31.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which are the major modes""" start="00:00:33.960" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""for the respective languages.""" start="00:00:35.000" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Before jumping into the demo""" start="00:00:39.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""of the Emacs package,""" start="00:00:40.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I would like to give a brief introduction""" start="00:00:42.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""about justfiles and what it is.""" start="00:00:44.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I will also try to compare it with Makefiles""" start="00:00:46.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""as it takes a lot of inspiration from it.""" start="00:00:49.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""What you see currently in the buffer""" start="00:00:53.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is a sample justfile.""" start="00:00:55.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""If you have previously used Makefiles,""" start="00:00:57.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you would be able to see""" start="00:00:59.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""that there is quite a bit of similarity""" start="00:01:00.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""between them.""" start="00:01:02.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Anything that starts with hash""" start="00:01:03.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is a documentation comment.""" start="00:01:05.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can see that I have the first recipe""" start="00:01:07.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which is named as default.""" start="00:01:09.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""So if you run the just executable""" start="00:01:10.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""without any arguments,""" start="00:01:12.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by default it is going to run""" start="00:01:14.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the first recipe.""" start="00:01:15.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""This recipe's definition""" start="00:01:17.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""calls the just command""" start="00:01:18.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in turn, with the two arguments,""" start="00:01:20.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""namely --list and --unsorted,""" start="00:01:21.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which basically asks just""" start="00:01:24.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to list down all the recipes""" start="00:01:25.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in an unsorted order.""" start="00:01:27.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Each line of each recipe is executed""" start="00:01:29.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by a fresh shell.""" start="00:01:32.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""That pretty much""" start="00:01:33.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is the high level overview""" start="00:01:35.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""of getting started to use this tool.""" start="00:01:36.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""This tool assumes the presence of a shell""" start="00:01:38.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which is bash in most GNU/Linux systems,""" start="00:01:40.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but you can configure it""" start="00:01:43.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to explicitly use any specific shell""" start="00:01:44.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you have in mind.""" start="00:01:47.160" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Let me in fact go and try executing""" start="00:01:48.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the first recipe.""" start="00:01:50.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I will first execute it""" start="00:01:52.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""without any arguments,""" start="00:01:53.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which will force it to run the first recipe.""" start="00:01:55.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see, it listed all the recipes.""" start="00:01:59.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Now I can actually execute""" start="00:02:01.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a particular recipe""" start="00:02:03.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by passing an explicit recipe name.""" start="00:02:04.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me execute the hello recipe now""" start="00:02:06.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which will basically print &quot;hello world&quot;.""" start="00:02:08.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""It works as expected.""" start="00:02:11.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see, that's all that's required""" start="00:02:15.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to get started with this tool.""" start="00:02:17.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You create a file named justfile""" start="00:02:18.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in a directory, define some recipes""" start="00:02:20.349" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and then run them""" start="00:02:22.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""via the just executable.""" start="00:02:23.640" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Note that there are""" start="00:02:27.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""various other features in justfile.""" start="00:02:28.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can define variables,""" start="00:02:30.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""mark some variables""" start="00:02:32.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to be exported as environment variables,""" start="00:02:33.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""have optional parameters""" start="00:02:35.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""that can be passed to a recipe.""" start="00:02:37.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can also set up dependency""" start="00:02:38.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""between recipes""" start="00:02:40.960" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and also write scripts within a recipe""" start="00:02:42.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in a language of your choice.""" start="00:02:44.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I won't be going into the details,""" start="00:02:46.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but I encourage you to go through""" start="00:02:48.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the very helpful manual page""" start="00:02:50.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to learn more about it.""" start="00:02:51.640" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Also, let me compare it with Makefiles.""" start="00:02:56.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I do think it's kind of unfair""" start="00:02:59.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to compare both the tools""" start="00:03:00.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""since make is a build automation tool""" start="00:03:02.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""whereas just's goal is a task runner,""" start="00:03:04.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and since just doesn't try to be""" start="00:03:07.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a build system,""" start="00:03:09.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it can avoid the associated complexity""" start="00:03:10.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""that comes with the tool like make.""" start="00:03:12.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""There is one nice historical fact""" start="00:03:15.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""about just.""" start="00:03:17.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""The initial version of just""" start="00:03:18.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""relied on make command being available,""" start="00:03:19.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""so it was basically""" start="00:03:21.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a glorified wrapper around it.""" start="00:03:23.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""But it was removed,""" start="00:03:25.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and justfile doesn't have""" start="00:03:26.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""that dependency anymore.""" start="00:03:27.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""If you are using make as a task runner""" start="00:03:29.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""then you would have to use""" start="00:03:31.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""something called phony targets.""" start="00:03:33.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I don't want to go into the details,""" start="00:03:35.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but makefiles have good reason""" start="00:03:37.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""for why they need something like that.""" start="00:03:39.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Since justfile is not a build system,""" start="00:03:41.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it doesn't have to deal with them.""" start="00:03:44.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""The error message""" start="00:03:45.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and user experience of this tool,""" start="00:03:47.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in my opinion, is better.""" start="00:03:48.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""To show you a concrete example,""" start="00:03:50.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""justfile errors out by default""" start="00:03:52.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""if you have duplicate recipes.""" start="00:03:54.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""This is in contrast with make""" start="00:03:56.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""where I believe it prints out""" start="00:03:58.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a warning about it,""" start="00:04:00.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but still executes the target action.""" start="00:04:01.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Justfile also gives you the ability""" start="00:04:03.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to easily create scripts""" start="00:04:06.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""written in any language within a recipe.""" start="00:04:08.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""My personal opinion is that""" start="00:04:10.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""if you are using makefile""" start="00:04:12.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""as a task runner,""" start="00:04:14.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you might want to check out justfile""" start="00:04:15.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to see if it will suit your workflow.""" start="00:04:17.440" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""With that, I'll move on to justl.el,""" start="00:04:19.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which is basically an Emacs package""" start="00:04:25.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""for driving justfiles.""" start="00:04:26.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I started writing this tool""" start="00:04:28.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""around a year ago""" start="00:04:29.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""when my usage of justfile increased.""" start="00:04:31.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""The objective of the tool""" start="00:04:33.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is to reduce the usage of the CLI""" start="00:04:35.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and drive the execution of the recipes""" start="00:04:37.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""natively within the editor.""" start="00:04:40.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me take you back to the justfile""" start="00:04:41.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which we saw previously.""" start="00:04:44.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""This time we will drive it""" start="00:04:45.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""within the editor itself,""" start="00:04:47.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""instead of executing commands via vterm""" start="00:04:48.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""as done previously.""" start="00:04:51.400" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""So the idea is you either""" start="00:04:52.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""open the justfile,""" start="00:04:54.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""or any other file in the directory.""" start="00:04:56.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""That doesn't matter, actually.""" start="00:04:57.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Once you do that,""" start="00:04:59.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you call the justl command.""" start="00:05:00.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Now as you can see, it lists down""" start="00:05:02.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""all the recipes,""" start="00:05:06.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""along with the description if present.""" start="00:05:07.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can move on to different recipes""" start="00:05:09.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by your usual keybinding.""" start="00:05:11.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""And for executing a specific recipe,""" start="00:05:13.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you have to press the e keybinding,""" start="00:05:15.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and that will run the recipe""" start="00:05:18.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and show its output""" start="00:05:19.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""on a special buffer named *just*""" start="00:05:21.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which is built on top of""" start="00:05:23.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the compilation mode available in Emacs.""" start="00:05:25.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me actually try""" start="00:05:27.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""executing the hello recipe""" start="00:05:28.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which we previously executed in vterm.""" start="00:05:30.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see,""" start="00:05:32.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it executed the recipe""" start="00:05:38.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and the &quot;hello world&quot; output""" start="00:05:39.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is visible in the just buffer.""" start="00:05:41.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can also see that there is""" start="00:05:42.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""other metadata like""" start="00:05:44.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""when it started executing""" start="00:05:45.880" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and when did it finish executing.""" start="00:05:47.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""If a recipe execution fails,""" start="00:05:49.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it will also change the color""" start="00:05:51.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and print the corresponding exit code.""" start="00:05:53.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me actually show you""" start="00:05:55.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by modifying the hello recipe""" start="00:05:57.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and making it exit.""" start="00:05:59.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see,""" start="00:06:03.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it clearly indicates the error message now.""" start="00:06:08.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""That is a pretty much""" start="00:06:10.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a good high level overview""" start="00:06:12.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""of how to execute recipes""" start="00:06:14.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""using this Emacs extension.""" start="00:06:15.680" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""If I press the h or the ? key,""" start="00:06:17.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it will display the various ways""" start="00:06:21.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to drive it.""" start="00:06:23.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Now as you can see,""" start="00:06:24.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""you can pass various options to it.""" start="00:06:27.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I find the dry run option effective""" start="00:06:29.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""whenever I have to print the recipe contents""" start="00:06:31.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""without actually executing the recipe.""" start="00:06:34.560" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""There are also various ways to execute it.""" start="00:06:36.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can use Emacs's eshell to execute it""" start="00:06:39.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by pressing the E keybinding.""" start="00:06:42.960" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me try executing the hello recipe again,""" start="00:06:45.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but this time via Emacs's eshell.""" start="00:06:48.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see now I have an eshell instance""" start="00:06:50.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""where it executed the just hello recipe.""" start="00:06:54.840" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""You can also directly""" start="00:06:57.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""go to the recipe line""" start="00:07:02.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by pressing the return key.""" start="00:07:03.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""So let's say if I want to""" start="00:07:05.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""go to the recipe build app""" start="00:07:08.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""all I have to do is press the return key""" start="00:07:09.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and it will go to the just file""" start="00:07:12.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""with the proper line.""" start="00:07:14.400" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""You can also re-execute the same recipe""" start="00:07:15.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""from the output just buffer.""" start="00:07:19.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I find this very helpful""" start="00:07:21.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""when iterating on certain things.""" start="00:07:23.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""In my day job,""" start="00:07:25.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I often have to work with a Kubernetes cluster,""" start="00:07:26.720" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and I would have to write""" start="00:07:29.240" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""resource manifest files for applications.""" start="00:07:30.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Having the ability to run the recipes""" start="00:07:33.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""while iterating on the project""" start="00:07:36.377" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is very useful, in my opinion.""" start="00:07:37.943" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Let me actually show you""" start="00:07:39.560" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""an example of what I am talking about.""" start="00:07:42.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me run the build app recipe now,""" start="00:07:43.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which will basically build the manifest""" start="00:07:46.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and print it out.""" start="00:07:48.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Now let me open one of the application files.""" start="00:07:49.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I will open the ingress.yaml file.""" start="00:07:58.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""So I have this YAML file which I am working on,""" start="00:07:59.960" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and I also have this output buffer""" start="00:08:06.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which is basically the output""" start="00:08:08.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""of the build app recipe.""" start="00:08:10.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Now I can basically go through this buffer""" start="00:08:11.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and see if everything is alright,""" start="00:08:14.200" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""but I find out that I didn't want""" start="00:08:18.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the hostname to be emacs2022.""" start="00:08:21.760" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I wanted it to be just emacs.""" start="00:08:23.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I can go and fix it in my YAML file,""" start="00:08:25.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and then I can go on""" start="00:08:29.000" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to the output buffer""" start="00:08:34.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and basically just re-run the command""" start="00:08:36.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""by pressing the g key binding.""" start="00:08:38.520" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see,""" start="00:08:40.080" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""it executed the same recipe again,""" start="00:08:42.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and I can see that""" start="00:08:48.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the hostname is indeed emacs.""" start="00:08:49.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I find this kind of workflow very convenient""" start="00:08:51.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""while I am working on a project.""" start="00:08:55.000" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""Another way of interacting""" start="00:08:56.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""with the justl extension""" start="00:08:59.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is by using the interactive function""" start="00:09:00.440" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""justl-exec-recipe-in-dir.""" start="00:09:02.400" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""The use case of this function""" start="00:09:04.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""is executing a one-off recipe""" start="00:09:06.040" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""while you are working on something else.""" start="00:09:07.840" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Let me show you an example of it.""" start="00:09:09.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""As you can see, it shows me""" start="00:09:11.960" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""a drop down of various recipes""" start="00:09:19.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""available in the justfile.""" start="00:09:21.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""You can choose any particular one""" start="00:09:22.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and execute the corresponding recipe.""" start="00:09:24.880" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""In this case, I will choose""" start="00:09:26.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""the build-app recipe,""" start="00:09:28.360" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and we will get the output""" start="00:09:29.640" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""in the *just* buffer""" start="00:09:31.320" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""which should be similar""" start="00:09:32.280" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to what we saw previously.""" start="00:09:33.200" video="mainVideo-justl" id="subtitle"]]
+[[!template new="1" text="""So this was a quick introduction""" start="00:09:34.680" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to what justfile is""" start="00:09:43.920" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and how to drive them within Emacs.""" start="00:09:45.120" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Hopefully it was helpful""" start="00:09:46.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""and it would encourage you""" start="00:09:48.600" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""to use justfiles in your workflow.""" start="00:09:50.160" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""Thank you for allowing me to present.""" start="00:09:51.480" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""I am available in IRC""" start="00:09:53.800" video="mainVideo-justl" id="subtitle"]]
+[[!template text="""if you have any questions.""" start="00:09:55.480" video="mainVideo-justl" id="subtitle"]]
+
+
+
+Captioner: sachac
Questions or comments? Please e-mail [psibi2000@gmail.com](mailto:psibi2000@gmail.com?subject=Comment%20for%20EmacsConf%202022%20justl%3A%20justl%3A%20Driving%20recipes%20within%20Emacs)
diff --git a/2022/info/justl-before.md b/2022/info/justl-before.md
index a713b8b0..1ca91fbd 100644
--- a/2022/info/justl-before.md
+++ b/2022/info/justl-before.md
@@ -3,16 +3,40 @@ In this talk, Sibi Prabakaran shares how to use justl to run justfile tasks from
The following image shows where the talk is in the schedule for Sun 2022-12-04. 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="justl">
-<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 Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:05- 9:25 Results of the 2022 Emacs Survey</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:55-10:20 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="86" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(123,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect stroke-width="3" x="172" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:00- 1:15 Getting detached from Emacs</title> <rect x="376" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(397,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</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 Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect stroke-width="3" x="172" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</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: 11-min talk followed by IRC Q&A (<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-dev">#emacsconf-dev</a>)
Etherpad: <https://pad.emacsconf.org/2022-justl>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Talk captioned
+Status: Now playing on the conference livestream
<div>Times in different timezones:</div><div class="times" start="2022-12-04T15:50:00Z" end="2022-12-04T16:05:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~10:50 AM - 11:05 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~9:50 AM - 10:05 AM CST (US/Central)<br />Sunday, Dec 4 2022, ~8:50 AM - 9:05 AM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~7:50 AM - 8:05 AM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~3:50 PM - 4:05 PM UTC <br />Sunday, Dec 4 2022, ~4:50 PM - 5:05 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~5:50 PM - 6:05 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~9:20 PM - 9:35 PM IST (Asia/Kolkata)<br />Sunday, Dec 4 2022, ~11:50 PM - 12:05 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~12:50 AM - 1:05 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div>
+[[!template id="vid" vidid="justl-mainVideo" src="https://media.emacsconf.org/2022/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.webm" poster="https://media.emacsconf.org/2022/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt" default />"""
+size="52M" duration="10:03" other_resources="""[Download --main.webm (52MB)](https://media.emacsconf.org/2022/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.webm)
+[Download --main.vtt](https://media.emacsconf.org/2022/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2022/emacsconf-2022-justl--justl-driving-recipes-within-emacs--sibi-prabakaran--main--chapters.vtt)
+[View transcript](https://emacsconf.org/2022/talks/justl#justl-mainVideo-transcript)
+[View on Toobnix](https://toobnix.org/w/tonDBKQYxzZMXQhreMpoca)
+"""]]
+[[!template id="chapters" vidid="justl-mainVideo" data="""
+00:00:00.000 Introduction
+00:39.320 Justfiles
+01:48.520 Executing recipes
+02:27.680 Other features
+02:56.440 Comparison with Makefiles
+04:19.280 justl.el
+04:52.400 Executing recipes in Emacs
+06:17.280 Options
+06:36.600 Eshell
+06:57.320 Going to the recipe line
+07:15.520 Re-executing recipes
+07:39.560 Example
+08:56.600 justl-exec-recipe-in-dir
+09:34.680 End
+
+"""]]
# Description