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.