WEBVTT
00:00.240 --> 00:00:01.839
Hi! My name is Eduardo Ochs.
00:00:01.839 --> 00:00:02.639
I'm the author of
00:00:02.639 --> 00:00:04.319
an Emacs package called eev,
00:00:04.319 --> 00:00:05.279
and this talk is about
00:00:05.279 --> 00:00:06.480
a new feature of eev
00:00:06.480 --> 00:00:08.400
called "test blocks".
00:08.400 --> 00:00:10.320
Let's start by a demo.
00:10.320 --> 00:00:12.320
This is a file in Lua that defines
00:00:12.320 --> 00:00:14.160
these two functions here,
00:14.160 --> 00:00:18.000
and if we type <f8> several times here,
00:18.000 --> 00:00:20.720
the <f8>s create a Lua REPL here
00:00:20.720 --> 00:00:22.240
and then they send these lines
00:00:22.240 --> 00:00:25.840
to the REPL, where this line here
00:00:25.840 --> 00:00:27.840
loads this file into the REPL,
00:00:27.840 --> 00:00:29.679
and these other lines here
00:29.679 --> 00:00:33.200
are tests for these lines.
00:33.200 --> 00:00:34.719
There's a lot of information here,
00:00:34.719 --> 00:00:36.160
so let me organize them
00:00:36.160 --> 00:00:40.480
in a more visual way.
00:40.480 --> 00:00:42.960
This is our file in Lua.
00:42.960 --> 00:00:44.559
Lua sees this thing
00:00:44.559 --> 00:00:46.160
as a multi-line comment,
00:00:46.160 --> 00:00:47.520
but we are going to see it
00:00:47.520 --> 00:00:48.879
as a test block.
00:00:48.879 --> 00:00:50.879
And eev mode is active,
00:00:50.879 --> 00:00:54.480
so <f8> does the right thing.
00:54.480 --> 00:00:56.800
These three lines here
00:00:56.800 --> 00:00:58.320
set up the target buffer
00:00:58.320 --> 00:01:00.000
running a Lua REPL.
00:01:00.000 --> 00:01:02.079
You can see the the prompt
00:01:02.079 --> 00:01:03.520
of the REPL here,
01:03.520 --> 00:01:04.640
and these lines here
00:01:04.640 --> 00:01:07.200
are sent to the REPL.
01:07.200 --> 00:01:08.960
When we type <f8>
00:01:08.960 --> 00:01:10.720
on a line that starts
01:10.720 --> 00:01:11.680
with a red star,
00:01:11.680 --> 00:01:13.600
like these lines here,
01:13.600 --> 00:01:15.119
what <f8> does is that
00:01:15.119 --> 00:01:17.537
it sends the rest of the line--
00:01:17.537 --> 00:01:18.880
sorry, it executes
00:01:18.880 --> 00:01:21.119
the rest of the line as Lisp.
01:21.119 --> 00:01:23.920
So the three <f8>s here
01:23.920 --> 00:01:26.000
executes these lines as Lisp,
00:01:26.000 --> 00:01:29.520
and they set up the target buffer here.
01:29.520 --> 00:01:31.119
When we type <f8>
00:01:31.119 --> 00:01:32.720
on a line that does not start
00:01:32.720 --> 00:01:34.159
with a red star,
00:01:34.159 --> 00:01:35.680
the <f8> sends the line
00:01:35.680 --> 00:01:38.799
to the target buffer and moves down.
01:38.799 --> 00:01:40.619
This line loads this file
00:01:40.619 --> 00:01:45.200
in the REPL, and these lines are tests.
01:45.200 --> 00:01:46.799
So we just saw how to use
00:01:46.799 --> 00:01:48.240
an existing test block;
00:01:48.240 --> 00:01:49.840
let's now see how to create
00:01:49.840 --> 00:01:51.280
a new test block.
00:01:51.280 --> 00:01:52.640
We just have to run this:
01:52.640 --> 00:01:55.680
M-x ee-insert-test-block -
01:55.680 --> 00:01:58.079
or M-x eeit.
01:58.079 --> 00:02:01.439
The result depends on the major mode.
02:01.439 --> 00:02:03.920
Let's understand that
02:03.920 --> 00:02:06.079
by looking at the source code.
02:06.079 --> 00:02:08.720
eeit is an alias to this function here,
02:08.720 --> 00:02:09.920
and this function is just
00:02:09.920 --> 00:02:12.800
five lines of code plus a docstring...
02:12.800 --> 00:02:14.160
and the docstring explains
00:02:14.160 --> 00:02:15.920
that if the major mode is foo-mode,
00:02:15.920 --> 00:02:18.800
then this function tries to call
02:18.800 --> 00:02:21.360
a function called ee-insert-test-foo-mode
02:21.360 --> 00:02:24.800
if that function exists,
02:24.800 --> 00:02:27.280
and that, if that function does not exist,
02:27.280 --> 00:02:29.680
then it yields an error.
02:29.680 --> 00:02:31.120
And here's an example
00:02:31.120 --> 00:02:32.560
of one such function.
00:02:32.560 --> 00:02:34.800
That's a function that inserts
00:02:34.800 --> 00:02:37.280
a test block in haskell-mode.
02:37.280 --> 00:02:40.959
Here we can see two functions like this:
00:02:40.959 --> 00:02:46.080
one for haskell-mode and one for js-mode.
02:46.080 --> 00:02:48.560
These functions look quite similar,
00:02:48.560 --> 00:02:52.720
but their effects look quite different.
02:52.720 --> 00:02:54.800
To make this comparison here,
00:02:54.800 --> 00:02:57.280
I started by writing--
02:57.280 --> 00:02:59.040
by creating seven files,
00:02:59.040 --> 00:03:01.120
each one in a different language.
03:01.120 --> 00:03:03.040
Initially, each one of these files
03:03.040 --> 00:03:04.159
only had a comment
00:03:04.159 --> 00:03:06.403
with the name of the language...
00:03:06.403 --> 00:03:10.560
so: C, Haskell, Javascript, Org Mode, etc.
03:10.560 --> 00:03:12.560
In each one of these files,
00:03:12.560 --> 00:03:16.959
I typed M-x eeit to insert a test block.
03:16.959 --> 00:03:18.319
So here we can see that
00:03:18.319 --> 00:03:20.319
these test blocks are different.
03:20.319 --> 00:03:21.440
For example, the syntax
00:03:21.440 --> 00:03:22.560
for multi-line comments
00:03:22.560 --> 00:03:25.200
is different depending on the language.
03:25.200 --> 00:03:27.440
This block here that selects
00:03:27.440 --> 00:03:30.100
which REPL to run is also different,
00:03:30.100 --> 00:03:34.080
and this line here that tells the REPL
00:03:34.080 --> 00:03:36.000
to load the current file
00:03:36.000 --> 00:03:37.680
is also different,
03:37.680 --> 00:03:39.680
depending on the language.
03:39.680 --> 00:03:41.840
In some cases, I had to improvise a bit.
03:41.840 --> 00:03:45.360
For example, to implement test blocks
00:03:45.360 --> 00:03:48.560
in shell mode, I had to use
03:48.560 --> 00:03:52.560
this weird syntax using a here-document.
03:52.560 --> 00:03:55.040
In Tcl, I also had to improvise a bit,
00:03:55.040 --> 00:03:55.920
and in some cases,
00:03:55.920 --> 00:03:57.840
I had to improvise a lot.
03:57.840 --> 00:04:00.159
For example, in Org Mode,
00:04:00.159 --> 00:04:02.400
there isn't an obvious REPL to run,
00:04:02.400 --> 00:04:03.840
and there isn't an obvious way
00:04:03.840 --> 00:04:06.480
to load the the current Org file
00:04:06.480 --> 00:04:09.360
into the REPL, so the default action
00:04:09.360 --> 00:04:12.560
of M-x eeit in Org Mode
00:04:12.560 --> 00:04:15.439
is just to insert this thing here,
04:15.439 --> 00:04:22.320
that we can use to run a shell in a REPL.
04:22.320 --> 00:04:25.280
So these functions are quite similar.
00:04:25.280 --> 00:04:26.240
In the beginning,
00:04:26.240 --> 00:04:27.919
I was writing all of them by hand...
00:04:27.919 --> 00:04:29.120
but then I got bored
00:04:29.120 --> 00:04:30.160
and I wrote a function
00:04:30.160 --> 00:04:33.840
to help me write functions like that.
04:33.840 --> 00:04:37.280
This function is called find-eeit-links,
00:04:37.280 --> 00:04:39.919
and it creates a temporary buffer,
04:39.919 --> 00:04:42.080
and the contents of this temporary buffer
00:04:42.080 --> 00:04:44.320
depends on the major mode. For example,
00:04:44.320 --> 00:04:45.680
if the current mode is python-mode,
04:45.680 --> 00:04:48.880
then running this function here
04:48.880 --> 00:04:50.160
creates a temporary buffer
00:04:50.160 --> 00:04:53.120
that lets me write the support
00:04:53.120 --> 00:04:55.440
for test blocks in python-mode,
00:04:55.440 --> 00:04:57.440
or rewrite the function
00:04:57.440 --> 00:04:59.040
that supports test blocks
04:59.040 --> 00:05:00.880
in python-mode.
05:00.880 --> 00:05:03.600
So if I'm in python-mode and I run this,
05:03.600 --> 00:05:06.639
I get a temporary buffer like this,
05:06.639 --> 00:05:08.639
in which this thing is my template
00:05:08.639 --> 00:05:11.039
for the function. Usually, this string
00:05:11.039 --> 00:05:11.919
is totally wrong,
00:05:11.919 --> 00:05:13.919
I have to rewrite this string,
05:13.919 --> 00:05:14.960
but the rest is right.
00:05:14.960 --> 00:05:16.960
You can see python-mode here
00:05:16.960 --> 00:05:18.479
in the name of the function.
00:05:18.479 --> 00:05:20.080
So we have to edit this
00:05:20.080 --> 00:05:22.840
and save that to our ~/.emacs.
05:22.840 --> 00:05:26.080
By the way, these things here
00:05:26.080 --> 00:05:28.880
hyperlinks to many different things...
05:28.880 --> 00:05:31.600
This Elisp hyperlink here
05:31.600 --> 00:05:32.880
points to the source code,
00:05:32.880 --> 00:05:36.880
to the section in which these functions
00:05:36.880 --> 00:05:39.919
are defined. So you can see this here,
00:05:39.919 --> 00:05:41.759
the function that supports C,
05:41.759 --> 00:05:42.800
the function for Haskell,
00:05:42.800 --> 00:05:46.400
the function for Javascript, etc...
05:46.400 --> 00:05:47.520
and that's it!
00:05:47.520 --> 00:05:49.440
This is a five-minute talk,
00:05:49.440 --> 00:05:50.960
so I can't say much...
05:50.960 --> 00:05:52.320
If you want more information,
00:05:52.320 --> 00:05:54.800
or if you want to see real-world examples,
00:05:54.800 --> 00:05:57.280
how I use test blocks, etc. etc.,
00:05:57.280 --> 00:05:58.639
see this page here...
00:05:58.639 --> 00:06:01.253
and I do not have time to explain this
00:06:01.253 --> 00:06:02.560
"By the way" here.
06:02.560 --> 06:03.333
So that's it! Thanks! =)
06:03.333 --> 06:04.333
[captions by Eduardo Ochs]