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.