WEBVTT

00:00:00.080 --> 00:00:01.708
Hi, my name is Eduardo Ochs.

00:00:01.708 --> 00:00:03.439
I'm this person here,

00:00:03.439 --> 00:00:06.240
and the title of this talk is on "Why

00:00:07.120 --> 00:00:09.519
Most of the Best Features in eev Look

00:00:09.519 --> 00:00:11.599
Like Five Minute Hacks."

00:00:11.599 --> 00:00:15.280
This is a presentation at the
EmacsConf 2020

00:00:15.280 --> 00:00:23.199
happening on November 28 and 29, 2020.

00:00:23.199 --> 00:00:25.519
So this is part one of the presentation.

00:00:25.519 --> 00:00:27.680
Here I'm going to explain

00:00:27.680 --> 00:00:29.840
some ideas that are prerequisites for

00:00:29.840 --> 00:00:32.320
understanding the rest of the
presentation.

00:00:32.320 --> 00:00:35.440
The three main keys of eev are

00:00:35.440 --> 00:00:37.920
M-e, M-k, and M-j.
I'm going to start by

00:00:37.920 --> 00:00:42.079
explaining M-e and M-k.

00:00:42.079 --> 00:00:44.960
M-e is used to follow hyperlinks.

00:00:44.960 --> 00:00:47.592
Technically, it is essentially

00:00:47.592 --> 00:00:49.345
just a C-e to move to

00:00:49.345 --> 00:00:50.402
the end of the line,

00:00:50.402 --> 00:00:53.918
and then a C-x C-e to
execute this,

00:00:53.918 --> 00:00:58.960
the sexp before point at
the end of the line.

00:00:58.960 --> 00:01:00.879
And the thing is that Emacs comes with

00:01:00.879 --> 00:01:02.479
many functions that can be

00:01:02.479 --> 00:01:05.040
used as sexp hyperlinks.

00:01:05.040 --> 00:01:07.540
We can consider that they point to
somewhere.

00:01:07.540 --> 00:01:09.040
I'm going to refer to that as

00:01:09.040 --> 00:01:11.411
the target of the hyperlink.

00:01:11.411 --> 00:01:12.960
If we execute this

00:01:12.960 --> 00:01:15.759
sexp hyperlinks, we coul go to that target.

00:01:15.759 --> 00:01:17.119
For example, this one

00:01:17.119 --> 00:01:20.000
is a hyperlink that points to a buffer

00:01:20.000 --> 00:01:22.720
with the manpage for cat.

00:01:22.720 --> 00:01:25.040
And usually, but not always, after

00:01:25.040 --> 00:01:27.040
following the hyperlink, we can go back

00:01:27.040 --> 00:01:29.840
by just killing the current buffer

00:01:29.840 --> 00:01:31.537
that the hyperlink created:

00:01:31.537 --> 00:01:34.400
the target of the hyperlink.

00:01:34.400 --> 00:01:38.000
But this example here is badly behaved.

00:01:38.000 --> 00:01:41.360
If we execute it, it creates a new frame,

00:01:41.360 --> 00:01:43.360
and to go back to the previous situation,

00:01:43.360 --> 00:01:52.840
we have to either click here
or type C-x 5 0.

00:01:54.880 --> 00:01:57.120
So here are some examples of

00:01:57.120 --> 00:01:58.726
sexp hyperlinks using

00:01:58.726 --> 00:02:00.640
standard Emacs functions.

00:02:00.640 --> 00:02:03.188
This third one is badly behaved

00:02:03.188 --> 00:02:04.880
in a different way.

00:02:04.880 --> 00:02:08.554
If executed, the target is created

00:02:08.554 --> 00:02:11.006
in the same window as we are now,

00:02:11.006 --> 00:02:14.312
but it also shows a lot of
garbage

00:02:14.312 --> 00:02:15.797
here in the echo area,

00:02:15.797 --> 00:02:23.280
so the current frame becomes
a bit messy.

00:02:23.280 --> 00:02:25.728
And well, one of the first things

00:02:25.728 --> 00:02:28.319
that I did when I was creating eev

00:02:28.319 --> 00:02:30.720
many many years ago was that I created

00:02:30.720 --> 00:02:33.380
variants of all these functions

00:02:33.380 --> 00:02:36.640
that were better behaved.

00:02:36.640 --> 00:02:39.200
They were better behaved in two
senses.

00:02:39.200 --> 00:02:40.839
The obvious one was that

00:02:40.839 --> 00:02:43.680
they all created the target

00:02:43.680 --> 00:02:45.246
in the same window as before,

00:02:45.246 --> 00:02:48.720
so I could go back by just typing M-k

00:02:48.720 --> 00:02:52.879
which has essentially just killed this
buffer.

00:02:52.879 --> 00:02:56.480
I also implemented something extra that

00:02:56.480 --> 00:02:59.040
are the postback lists.

00:02:59.040 --> 00:03:03.599
For example, these extra arguments here
are a postback list.

00:03:03.599 --> 00:03:06.080
These extra arguments specify

00:03:06.080 --> 00:03:09.599
position and the target buffer.

00:03:09.599 --> 00:03:14.337
In this example,
this postback list means:

00:03:14.337 --> 00:03:18.239
starting from the beginning of
the buffer,

00:03:18.239 --> 00:03:22.757
search for the first occurrence
of this string after that,

00:03:22.757 --> 00:03:24.754
after the beginning
of the buffer,

00:03:24.754 --> 00:03:27.662
and then search for
the first occurrence

00:03:27.662 --> 00:03:33.760
of this string after that.

00:03:33.760 --> 00:03:36.070
eev also defines some hyperlinks

00:03:36.070 --> 00:03:38.799
that do not create new buffers.

00:03:38.799 --> 00:03:40.879
Here is the first example.

00:03:40.879 --> 00:03:42.971
If I execute this one,

00:03:42.971 --> 00:03:45.920
this one is a hyperlink

00:03:45.920 --> 00:03:46.959
to the result

00:03:46.959 --> 00:03:50.720
of running this show comment date,

00:03:50.720 --> 00:03:52.623
but instead of showing the result

00:03:52.623 --> 00:03:53.767
in the new buffer,

00:03:53.767 --> 00:03:55.475
the result is shown
here.

00:03:55.475 --> 00:03:58.959
So, if I execute this hyperlink,

00:03:58.959 --> 00:04:01.634
the result of date, the output of date,

00:04:01.634 --> 00:04:03.339
is shown in the echo area.

00:04:03.339 --> 00:04:07.120
And if executed again,

00:04:07.120 --> 00:04:08.673
it shows the result again,

00:04:08.673 --> 00:04:09.519
and the result

00:04:09.519 --> 00:04:11.519
changes every second.

00:04:11.519 --> 00:04:18.720
So this is a variant of find-sh.

00:04:18.720 --> 00:04:21.840
find-sh0 is the variant that

00:04:21.840 --> 00:04:24.960
just shows the output in the echo area,

00:04:24.960 --> 00:04:28.080
and find-sh shows the output in

00:04:28.080 --> 00:04:31.759
a new buffer.

00:04:31.759 --> 00:04:35.919
Here is an example of a hyperlink

00:04:35.919 --> 00:04:39.173
that calls an external program.

00:04:39.173 --> 00:04:41.280
If I execute this,

00:04:41.280 --> 00:04:43.604
it calls Google Chrome to open

00:04:43.604 --> 00:04:46.639
a certain URL.

00:04:46.639 --> 00:04:51.520
Here it is. Let's go back to Emacs.

00:04:51.520 --> 00:04:55.280
If I execute this hyperlink here,

00:04:55.280 --> 00:04:57.986
it invokes my favorite PDF viewer

00:04:57.986 --> 00:05:02.560
which is xpdf. It makes xpdf

00:05:02.560 --> 00:05:07.759
open this PDF page. It is PDF

00:05:07.759 --> 00:05:10.880
in this page, and these other arguments

00:05:10.880 --> 00:05:15.199
are ignored. Let me show how it works.

00:05:15.199 --> 00:05:20.160
Here it is. This is an excerpt from a
book.

00:05:20.160 --> 00:05:22.639
So page 3 in the pdf corresponds to

00:05:22.639 --> 00:05:26.400
page 113 in the book.

00:05:26.400 --> 00:05:29.360
This variant here of the hyperlink above,

00:05:29.360 --> 00:05:31.759
it opens the PDF in a different way.

00:05:31.759 --> 00:05:34.560
It runs a program called pdftotext on

00:05:34.560 --> 00:05:36.479
this PDF here,

00:05:36.479 --> 00:05:39.600
and Emacs takes the output of

00:05:39.600 --> 00:05:42.880
running pdftotext on this pdf here

00:05:42.880 --> 00:05:45.301
and displays it in a buffer.

00:05:45.301 --> 00:05:47.280
Now this postback list

00:05:47.280 --> 00:05:49.651
is interpreted in a different way.

00:05:49.651 --> 00:05:51.280
This thing is interpreted

00:05:51.280 --> 00:05:53.425
as a number of a page,

00:05:53.425 --> 00:05:55.548
and Emacs goes to page three

00:05:55.548 --> 00:05:57.520
by counting form feeds in

00:05:57.520 --> 00:06:00.370
the converted version of the PDF

00:06:00.370 --> 00:06:03.039
and then it searches for this string.

00:06:03.039 --> 00:06:06.319
and in this three... So let's execute this

00:06:06.319 --> 00:06:09.169
to see what happens.
Here it is.

00:06:09.169 --> 00:06:14.800
I opened the same page
as before.

00:06:14.800 --> 00:06:18.400
It starts with lecture one.

00:06:18.400 --> 00:06:20.720
So the other hyperlink searched for this

00:06:20.720 --> 00:06:25.520
string and for this string here.

00:06:25.520 --> 00:06:30.400
This thing here is a hyperlink
to video,

00:06:30.400 --> 00:06:31.644
and when I execute it,

00:06:31.644 --> 00:06:34.560
it's going to open this video here

00:06:34.560 --> 00:06:37.759
at this timestamp. Let's see.

00:06:37.759 --> 00:06:49.440
1, 2, 3. 1, 2, 3.
That's the way to do it.

00:06:49.440 --> 00:06:51.956
And also some hyperlinks

00:06:51.956 --> 00:06:53.680
that I defined,

00:06:53.680 --> 00:06:55.940
they don't work like

00:06:55.940 --> 00:06:58.160
usual hyperlinks. They work more

00:06:58.160 --> 00:07:01.440
like browser buttons,

00:07:01.440 --> 00:07:06.240
these buttons that appear in web pages,

00:07:06.240 --> 00:07:09.120
in the sense that these buttons usually

00:07:09.120 --> 00:07:11.360
don't open a new page. They usually

00:07:11.360 --> 00:07:14.960
just do something to change
the current page.

00:07:14.960 --> 00:07:17.312
If I execute this, the action

00:07:17.312 --> 00:07:22.240
of this function eek is to...

00:07:22.240 --> 00:07:25.423
It interprets this string
as a series of keys

00:07:25.423 --> 00:07:30.051
and it acts as if the user had
typed all these keys.

00:07:30.051 --> 00:07:32.706
So if executed, I get a hello

00:07:32.706 --> 00:07:34.400
in the next line.

00:07:34.400 --> 00:07:36.639
If executed again, I get another hello.

00:07:36.639 --> 00:07:39.440
Another hello. hello. hello. etc. etc.

00:07:39.440 --> 00:07:44.319
Let me undo this mess. Oops.

00:07:44.319 --> 00:07:47.840
And here is another kind of button

00:07:47.840 --> 00:07:51.440
that defines a new function. If I execute

00:07:51.440 --> 00:07:54.879
this sexp here, at this moment, though it's

00:07:54.879 --> 00:07:55.759
not defined.

00:07:55.759 --> 00:07:57.919
And if I execute this, Emacs is going to

00:07:57.919 --> 00:08:00.000
show me a message saying

00:08:00.000 --> 00:08:03.599
symbol as function cell is not defined,

00:08:03.599 --> 00:08:05.840
something like this.

00:08:05.840 --> 00:08:09.520
But if I execute the defun,

00:08:09.520 --> 00:08:12.960
the action of this function o here

00:08:12.960 --> 00:08:18.960
is to run this, which opens a certain
directory.

00:08:18.960 --> 00:08:21.840
Let me go back. Here is another

00:08:21.840 --> 00:08:23.039
button that defines

00:08:23.039 --> 00:08:25.489
several functions at the same time.

00:08:25.489 --> 00:08:32.320
If I execute this,

00:08:32.320 --> 00:08:34.561
note that the the result of

00:08:34.561 --> 00:08:36.719
executing this expression

00:08:36.719 --> 00:08:38.447
is the name of one of the functions

00:08:38.447 --> 00:08:40.080
that it defined.

00:08:40.080 --> 00:08:42.800
That is this one here. Let me explain

00:08:42.800 --> 00:08:46.959
these examples. One of the functions

00:08:46.959 --> 00:08:48.800
that this thing here defined

00:08:48.800 --> 00:08:51.839
is called find-orggitfile, where

00:08:51.839 --> 00:08:54.640
this orggit in the middle of its name

00:08:54.640 --> 00:08:59.600
is exactly this first argument to
code-c-d.

00:08:59.600 --> 00:09:03.120
The action of running find-orggitfile

00:09:03.120 --> 00:09:06.399
on a string like this is that

00:09:06.399 --> 00:09:09.680
find-orggitfile takes the string

00:09:09.680 --> 00:09:13.360
and prepends this string to it,

00:09:13.360 --> 00:09:15.600
this one here which is the second

00:09:15.600 --> 00:09:17.920
argument to code-c-d,

00:09:17.920 --> 00:09:21.760
and then it executes find-fline

00:09:21.760 --> 00:09:25.680
on the result, which is this one.

00:09:25.680 --> 00:09:28.320
find-fline is my variant of find-file

00:09:28.800 --> 00:09:32.080
that supports both spec lists.

00:09:32.080 --> 00:09:36.880
This function here that I'm

00:09:36.880 --> 00:09:38.538
referring to as a button,

00:09:38.538 --> 00:09:41.200
it also defines a function called

00:09:41.200 --> 00:09:44.880
find-orggitnode here, where the orggit

00:09:44.880 --> 00:09:46.839
is the same string as here.

00:09:46.839 --> 00:09:50.320
This function opens a node

00:09:50.320 --> 00:09:54.160
of an info manual. This one,

00:09:54.160 --> 00:09:57.310
this text here opens this node

00:09:57.310 --> 00:10:00.080
in the Org manual.

00:10:00.080 --> 00:10:03.519
It is equivalent to this text here.

00:10:03.519 --> 00:10:06.225
So in the passage from this line

00:10:06.225 --> 00:10:08.720
to this line, we prepended

00:10:08.720 --> 00:10:12.310
to the node name the name of
the manual here.

00:10:12.310 --> 00:10:15.040
find-node is my variant

00:10:15.040 --> 00:10:18.160
of this standard Emacs function here,

00:10:18.160 --> 00:10:20.119
but find-node also supports

00:10:20.119 --> 00:10:23.519
postback lists.

00:10:23.519 --> 00:10:26.640
eev also defines some functions that

00:10:26.640 --> 00:10:28.423
define shorter hyperlinks to PDFs

00:10:28.423 --> 00:10:30.800
and videos.

00:10:30.800 --> 00:10:32.574
Remember that this thing here

00:10:32.574 --> 00:10:34.322
is a shorter hyperlink

00:10:34.322 --> 00:10:36.668
to a file. This thing here

00:10:36.668 --> 00:10:39.040
is a shorter hyperlink to a node

00:10:39.040 --> 00:10:43.200
in an Emacs menu in an info manual.

00:10:43.200 --> 00:10:47.279
If we run this thing here, this
code-pdf-page,

00:10:47.279 --> 00:10:50.240
this acts like a button that defines a

00:10:50.240 --> 00:10:52.880
certain function

00:10:52.880 --> 00:10:56.669
and this string,
this other sexp here,

00:10:56.669 --> 00:10:58.430
defines another function.

00:10:58.430 --> 00:11:00.240
The first one defines

00:11:00.240 --> 00:11:02.745
the function find-fongspivak-page,

00:11:02.745 --> 00:11:05.360
and the second one defines the
function find-fongspivak-text.

00:11:05.360 --> 00:11:09.608
When we run the file,

00:11:09.608 --> 00:11:12.020
when we run find-fongspivak-page,

00:11:12.020 --> 00:11:15.686
it opens this PDF here.

00:11:15.686 --> 00:11:20.640
The name is quite long.

00:11:20.640 --> 00:11:23.839
This example opens this PDF at page 8

00:11:23.839 --> 00:11:26.079
and searches for the string contents.

00:11:26.079 --> 00:11:31.279
In this case, it just ignores
this string.

00:11:31.279 --> 00:11:33.519
Here it only considers

00:11:33.519 --> 00:11:37.360
the number of the page. Let's try.

00:11:42.640 --> 00:11:45.200
Here it is, the contents of a book

00:11:45.200 --> 00:11:51.760
that is freely available. Here is
another page of the book.

00:11:51.760 --> 00:11:55.519
And if we execute this
hyperlink here,

00:11:55.519 --> 00:11:58.399
find-fongspivak-text, it converts the

00:11:58.399 --> 00:11:59.920
PDF to text

00:11:59.920 --> 00:12:03.382
and it searches for
page eight in it,

00:12:03.382 --> 00:12:04.754
and then for the string,

00:12:04.754 --> 00:12:08.079
this string here in page eight.

00:12:08.079 --> 00:12:12.240
It takes a few seconds.

00:12:12.240 --> 00:12:16.160
Here it is. So this is the

00:12:16.160 --> 00:12:20.892
ASCII version of this contents page
here.

00:12:20.892 --> 00:12:25.040
Note that this block here

00:12:25.040 --> 00:12:28.800
is a kind of an index to that book.

00:12:28.800 --> 00:12:31.360
I have the full index somewhere,

00:12:31.360 --> 00:12:32.506
but it's very long,

00:12:32.506 --> 00:12:34.959
so I just copied a few lines here.

00:12:34.959 --> 00:12:38.959
So this is a link to s

00:12:38.959 --> 00:12:42.160
section one, chapter one. This is the

00:12:42.160 --> 00:12:48.959
section 1.1, section 1.1.1, and so on.

00:12:48.959 --> 00:12:54.000
Here is a link to the index.

00:12:54.000 --> 00:12:58.079
Here is a part of my index

00:12:58.079 --> 00:13:03.279
of positions in the video
that we just saw

00:13:03.279 --> 00:13:07.360
that I think that are especially
relevant.

00:13:07.360 --> 00:13:11.940
So this hyperlink is a kind
of a button

00:13:11.940 --> 00:13:14.160
that defines this function here,

00:13:14.160 --> 00:13:18.839
find-punchandjudyvideo. Into the video.

00:13:27.600 --> 00:13:30.800
We can also use this for

00:13:30.800 --> 00:13:33.360
video tutorials. For example,

00:13:33.360 --> 00:13:37.200
this is a very good tutorial on Magit.

00:13:37.200 --> 00:13:40.880
If we execute this,

00:13:40.880 --> 00:13:42.560
then these functions are going to be

00:13:42.560 --> 00:13:44.800
defined, and these functions open

00:13:44.800 --> 00:13:48.399
this tutorial on Magit.

00:13:48.399 --> 00:13:50.079
These are some of the positions in the

00:13:50.079 --> 00:13:52.904
tutorial that I found
especially relevant.

00:13:52.904 --> 00:13:54.408
This is a very dense tutorial.

00:13:54.408 --> 00:13:56.480
I had to take notes
of everything,

00:13:56.480 --> 00:13:59.040
and I had to watch everything

00:13:59.040 --> 00:14:00.800
several times.

00:14:00.800 --> 00:14:02.896
For example, this is a link

00:14:02.896 --> 00:14:05.444
to the position in the tutorial

00:14:05.444 --> 00:14:11.005
that explains how in Spacemacs,

00:14:11.005 --> 00:14:17.600
Magit interprets SPC g s as magit-status.

00:14:17.600 --> 00:14:20.480
Let's see. "...beginners.
SPC g s to initiate

00:14:20.480 --> 00:14:22.320
Magit's git status.

00:14:22.320 --> 00:14:25.600
You can also do..." That's it.

00:14:25.600 --> 00:14:28.800
Here are some examples that I

00:14:28.800 --> 00:14:31.200
took from somewhere else.

00:14:31.200 --> 00:14:34.240
The video tutorials from

00:14:34.240 --> 00:14:43.519
Rainer Koenig about Org Mode.

00:14:43.519 --> 00:14:45.308
Now let me show how the functions

00:14:45.308 --> 00:14:47.220
that define these shorter hyperlinks

00:14:47.220 --> 00:14:48.720
are implemented.

00:14:48.720 --> 00:14:50.509
The standard ways in Emacs

00:14:50.509 --> 00:14:53.741
to define functions that define
other functions

00:14:53.741 --> 00:14:55.760
would be with macros.

00:14:55.760 --> 00:14:58.320
Let's see an example. This is a standard

00:14:58.320 --> 00:15:01.540
function that defines new functions.

00:15:02.959 --> 00:15:06.959
If we execute it,

00:15:06.959 --> 00:15:09.040
its result is the last function that it

00:15:09.040 --> 00:15:11.527
defined, which is ee-glyph,

00:15:11.527 --> 00:15:13.920
which is here.

00:15:13.920 --> 00:15:16.959
It's implemented as a macro. We can

00:15:16.959 --> 00:15:20.880
look at the result of macro-expand,
which is going to

00:15:20.880 --> 00:15:22.975
show us the result of this,

00:15:22.975 --> 00:15:25.519
of the expansion of this.

00:15:25.519 --> 00:15:27.804
Instead of expanding and executing,

00:15:27.804 --> 00:15:33.199
it just expands and shows us the result.

00:15:33.199 --> 00:15:35.439
Here the result is a bit messy.

00:15:35.439 --> 00:15:39.396
It's too big for humans to understand,

00:15:39.396 --> 00:15:42.894
but we can run this or this text here.

00:15:42.894 --> 00:15:47.519
That takes that result
and pretty-prints it.

00:15:47.519 --> 00:15:50.701
So this is the pretty-printed version

00:15:50.701 --> 00:15:54.000
of this macro here.

00:15:54.000 --> 00:15:57.600
We can see that it defines

00:15:57.600 --> 00:16:01.120
several functions here.

00:16:01.120 --> 00:16:06.399
For example, this one.

00:16:06.399 --> 00:16:09.360
And this, just as a curiosity, is a link

00:16:09.360 --> 00:16:13.839
to the definition of cl-defstruct.

00:16:13.839 --> 00:16:16.880
Note that the code is huge.

00:16:16.880 --> 00:16:18.677
Well, it's very well-commented,

00:16:18.677 --> 00:16:22.577
but it has lots of special cases.

00:16:22.577 --> 00:16:26.210
It supports lots of constructions,

00:16:26.210 --> 00:16:27.920
and so it's huge.

00:16:27.920 --> 00:16:30.174
It's very difficult to understand.

00:16:30.174 --> 00:16:33.360
I mean, I found it very difficult
to understand.

00:16:33.360 --> 00:16:35.040
Here's a link to document the

00:16:35.040 --> 00:16:37.759
documentation of cl-defstruct

00:16:37.759 --> 00:16:42.210
here in the manual for cl,

00:16:42.210 --> 00:16:45.025
which is a kind of support

00:16:45.025 --> 00:16:50.480
for some features of Common Lisp
in Emacs.

00:16:50.480 --> 00:16:53.825
So let's compare this standard way of

00:16:53.825 --> 00:16:56.560
defining functions that
define new functions,

00:16:56.560 --> 00:16:59.253
which is with macros,
with this.

00:16:59.253 --> 00:17:02.300
I'm going to use a slogan
repeatedly.

00:17:02.300 --> 00:17:06.319
The slogan is: "I am a very bad
programmer."

00:17:06.319 --> 00:17:08.005
I'm a very bad programmer.

00:17:08.005 --> 00:17:10.082
So, when I was trying to create
functions

00:17:10.082 --> 00:17:12.240
that would define new functions,

00:17:12.240 --> 00:17:14.480
I found it easier to generally generate

00:17:14.480 --> 00:17:16.400
this code as text,

00:17:16.400 --> 00:17:20.559
and then run read and eval in it.

00:17:20.559 --> 00:17:24.640
The code-c-d that we saw
in the previous section,

00:17:24.640 --> 00:17:28.079
we can see the code that it produces

00:17:28.079 --> 00:17:30.769
by making a copy of this line

00:17:30.769 --> 00:17:32.579
and prepending this string here

00:17:32.579 --> 00:17:34.480
to the name of the function.

00:17:34.480 --> 00:17:36.317
So, instead of running code-c-d,

00:17:36.317 --> 00:17:38.400
we run find-code-cd,

00:17:38.400 --> 00:17:41.280
and it creates a new temporary buffer

00:17:41.280 --> 00:17:44.400
with the code that

00:17:44.400 --> 00:17:47.760
code-c-d would execute.

00:17:47.760 --> 00:17:54.080
So it's a series of the defuns
and a few setqs and so on.

00:17:54.080 --> 00:17:59.120
And this thing is implemented mostly as
a template.

00:18:02.160 --> 00:18:04.045
There's an inner function called

00:18:04.045 --> 00:18:06.240
ee-code-c-d-base that receives just

00:18:06.240 --> 00:18:08.799
these two arguments, and it says...

00:18:08.799 --> 00:18:10.640
Essentially, it just runs the function

00:18:10.640 --> 00:18:14.320
ee-template0 on the string here, and

00:18:14.320 --> 00:18:16.480
the things between curly braces are

00:18:16.480 --> 00:18:18.559
substituted by the values

00:18:18.559 --> 00:18:23.600
of these arguments here.

00:18:23.600 --> 00:18:25.919
There's one part of the tutorial here

00:18:25.919 --> 00:18:28.480
that explains all these things,

00:18:28.480 --> 00:18:31.039
except for the rationale for some

00:18:31.039 --> 00:18:32.559
design decisions,

00:18:32.559 --> 00:18:35.360
and those design decisions are one of

00:18:35.360 --> 00:18:37.280
the many motivations for this talk.

00:18:37.760 --> 00:18:39.679
I'm only going to explain these

00:18:39.679 --> 00:18:42.640
things in detail at the end,

00:18:42.640 --> 00:18:48.480
which is kind of...

00:18:48.480 --> 00:18:49.662
So in the beginning, I said

00:18:49.662 --> 00:18:51.600
that the three main keys of eev

00:18:51.600 --> 00:18:56.000
are M-e, M-k and M-j.

00:18:56.000 --> 00:19:00.080
Let's see now what M-j does.

00:19:00.080 --> 00:19:02.447
I need to start with some
motivation.

00:19:02.447 --> 00:19:04.640
The motivation is that we

00:19:04.640 --> 00:19:06.559
can define commands with very short

00:19:06.559 --> 00:19:08.240
names. Actually, I became kind of

00:19:08.240 --> 00:19:10.160
addicted to that.

00:19:10.160 --> 00:19:13.200
This is an example of defun that

00:19:13.200 --> 00:19:15.600
defines a comment with a very short name.

00:19:15.600 --> 00:19:18.000
Its name is just one letter, "e."

00:19:18.000 --> 00:19:20.530
and I can invoke... You invoke it

00:19:20.530 --> 00:19:21.856
with M-x e.

00:19:21.856 --> 00:19:24.720
If I type M-x p,

00:19:24.720 --> 00:19:26.661
now it opens a LaTeX file

00:19:26.661 --> 00:19:31.130
that I'm working on.

00:19:32.559 --> 00:19:35.200
I create most of my LaTeX files

00:19:35.200 --> 00:19:39.200
using template-based functions like

00:19:39.200 --> 00:19:43.760
the implementation of code-c-d above.

00:19:43.760 --> 00:19:45.576
These template-based functions

00:19:45.576 --> 00:19:49.280
create files with extension .tex

00:19:49.280 --> 00:19:51.280
that start with a series of defuns

00:19:51.280 --> 00:19:53.919
in comments. For example,

00:19:53.919 --> 00:19:55.926
let's look at this example here.

00:19:55.926 --> 00:19:58.049
If I execute find-latex-links

00:19:58.049 --> 00:19:59.440
with this argument,

00:19:59.440 --> 00:20:02.525
it's going to do several things

00:20:02.525 --> 00:20:08.320
for creating a file called /tmp/foo.tex,

00:20:08.320 --> 00:20:10.387
and the header of that file

00:20:10.387 --> 00:20:12.400
is going to be this,

00:20:12.400 --> 00:20:16.080
which starts with three

00:20:16.080 --> 00:20:19.280
defuns with functions with very short

00:20:19.280 --> 00:20:21.919
names and comments.

00:20:21.919 --> 00:20:27.520
Let's compare with the situation here.

00:20:27.520 --> 00:20:32.799
In my file, 2020favorite-conventions.tex,

00:20:32.799 --> 00:20:34.640
I have this header here in which I

00:20:34.640 --> 00:20:39.360
define six functions with
very short names.

00:20:39.360 --> 00:20:41.919
And in this case here, that is even

00:20:41.919 --> 00:20:44.799
explained in the tutorial.

00:20:44.799 --> 00:20:48.000
These... We have mnemonics for

00:20:48.000 --> 00:20:51.520
these short names here. c is compile,

00:20:51.520 --> 00:20:54.799
d is display. I mean, display the PDF.

00:20:54.799 --> 00:20:57.377
e is added in the sense of

00:20:57.377 --> 00:21:02.320
make Emacs visit that file.

00:21:02.320 --> 00:21:06.480
Now I can explain what is M-j
itself.

00:21:06.480 --> 00:21:09.600
We just saw commands with
very short names.

00:21:09.600 --> 00:21:12.048
The idea behind M-j is that

00:21:12.048 --> 00:21:14.031
we can define commands with

00:21:14.031 --> 00:21:16.480
very short numbers.

00:21:16.480 --> 00:21:19.679
Let me explain this.

00:21:19.679 --> 00:21:23.039
The short explanation
for what M-j does

00:21:23.039 --> 00:21:25.360
is that it jumps to set certain

00:21:25.360 --> 00:21:27.039
predefined places.

00:21:27.039 --> 00:21:30.799
In particular, a M-j without
a numeric argument

00:21:30.799 --> 00:21:32.216
takes us to a buffer

00:21:32.216 --> 00:21:34.080
with the basic help

00:21:34.080 --> 00:21:37.679
and a list of the current jump targets.

00:21:37.679 --> 00:21:39.760
This is something that is a bit

00:21:39.760 --> 00:21:41.520
simpler to understand.

00:21:41.520 --> 00:21:44.559
If we type M-5 M-j,

00:21:44.559 --> 00:21:48.411
then M-j runs this sexp here

00:21:48.411 --> 00:21:51.120
that is associated to

00:21:51.120 --> 00:21:55.440
the argument 5. I say that the target

00:21:55.440 --> 00:21:59.039
for the argument 5 is this one,

00:21:59.039 --> 00:22:01.520
and if the argument is true, then the

00:22:01.520 --> 00:22:03.760
target associated to the true

00:22:03.760 --> 00:22:07.039
is this sexp here that opens...

00:22:07.039 --> 00:22:09.600
This one opens the main tutorial
for eev,

00:22:09.600 --> 00:22:13.679
and this one opens another tutorial.

00:22:13.679 --> 00:22:15.679
This is a link to one of the tutorials

00:22:15.679 --> 00:22:20.480
of eev to the part that explains M-j.

00:22:20.480 --> 00:22:22.212
I've copied the the main part

00:22:22.212 --> 00:22:24.559
of the text here.

00:22:24.559 --> 00:22:28.159
The header that M-j shows...

00:22:28.159 --> 00:22:31.360
Let me show it very quickly here.

00:22:31.360 --> 00:22:36.320
Here is their head and
here is the rest.

00:22:36.320 --> 00:22:38.773
The header is very beginner friendly,

00:22:38.773 --> 00:22:40.000
and if you're a beginner

00:22:40.000 --> 00:22:42.159
who only knows how to use M-e to

00:22:42.159 --> 00:22:44.559
execute and...

00:22:44.559 --> 00:22:46.706
This should be okay.

00:22:46.706 --> 00:22:48.240
M-k to go back.

00:22:48.240 --> 00:22:52.320
Then you can and should use that header--

00:22:52.320 --> 00:22:56.720
I mean, this header here--

00:22:56.720 --> 00:22:58.894
as your main starting point.

00:22:58.894 --> 00:23:00.799
Every time that you feel lost,

00:23:00.799 --> 00:23:04.799
you can type M-j to go back to
that header,

00:23:04.799 --> 00:23:08.000
and you can use its links to
navigate to the documentation

00:23:08.000 --> 00:23:11.360
for Emacs and eev. Let me explain that.

00:23:11.360 --> 00:23:15.679
This header here has several elisp
hyperlinks.

00:23:15.679 --> 00:23:22.400
One here, one here, one here,
one here, and so on.

00:23:22.400 --> 00:23:25.760
These ones are links to the

00:23:25.760 --> 00:23:29.280
to the intros, which are the tutorials.

00:23:29.280 --> 00:23:31.520
find-eev-quick-intro is the
main tutorial,

00:23:31.520 --> 00:23:35.760
and find-emacs-keys-intro is a
kind of tutorial that is

00:23:35.760 --> 00:23:40.000
an index of the main keys.

00:23:40.000 --> 00:23:42.559
After that, we have an explanation of

00:23:42.559 --> 00:23:45.449
what some numeric prefixes do.

00:23:45.449 --> 00:23:49.913
So if we type M-1 M-j,
the effect of that

00:23:49.913 --> 00:23:53.200
is exactly the same as
executing this.

00:23:53.200 --> 00:24:00.159
We can execute this with M-e also.

00:24:00.159 --> 00:24:03.679
M-2 M-j runs this sexp and

00:24:03.679 --> 00:24:06.960
I can also execute it with M-e.

00:24:06.960 --> 00:24:18.400
Here it is. It's this intro, this
sandbox tutorial.

00:24:18.400 --> 00:24:24.640
Here is another sandbox tutorial.

00:24:24.640 --> 00:24:27.039
Let me go back. Then the

00:24:27.039 --> 00:24:29.388
documentation says that header,

00:24:29.388 --> 00:24:31.760
the header that is beginner-friendly

00:24:31.760 --> 00:24:33.679
is followed by a section that is very

00:24:33.679 --> 00:24:35.520
beginner-unfriendly

00:24:35.520 --> 00:24:40.400
that contains a series of defuns
like these ones.

00:24:40.400 --> 00:24:44.640
Here, the last line of the header is
this comment here.

00:24:44.640 --> 00:24:48.559
Then we have several defuns like this.

00:24:48.559 --> 00:24:51.440
Let me explain how these things work.

00:24:51.440 --> 00:24:53.082
Technically, what happens

00:24:53.082 --> 00:24:56.399
when we type M-j without any arguments

00:24:56.399 --> 00:25:00.230
is that it runs eejump with argument nil,

00:25:00.230 --> 00:25:04.640
and then this runs 5 eejumps.

00:25:04.640 --> 00:25:07.224
When I run M-j with a numeric argument,

00:25:07.224 --> 00:25:13.374
for example, with argument 5,
it runs a jump 5.

00:25:13.374 --> 00:25:17.679
eejump-5 concatenates this 5 one

00:25:17.679 --> 00:25:19.999
to make a name of a function,

00:25:19.999 --> 00:25:21.679
this function here.

00:25:21.679 --> 00:25:24.720
and it executes this function
eejump-5.

00:25:24.720 --> 00:25:31.919
You jump -5, and eejump-5

00:25:31.919 --> 00:25:35.520
executes find-eev-quick-intro.

00:25:35.520 --> 00:25:39.360
If I execute just M-j,

00:25:39.360 --> 00:25:40.533
the section that shows

00:25:40.533 --> 00:25:43.919
the current jump targets

00:25:43.919 --> 00:25:46.719
has a line for eejump-5. This is...

00:25:46.719 --> 00:25:52.400
That is exactly the thing
that I was explaining before.

00:25:52.400 --> 00:25:54.544
So we can use M-j to navigate

00:25:54.544 --> 00:25:59.520
the tutorials. We can copy the links.

00:25:59.520 --> 00:26:03.440
Sorry. We can copy links to the

00:26:03.440 --> 00:26:07.919
tutorials to our notes.

00:26:07.919 --> 00:26:11.840
Oh, sorry, this has some typos.

00:26:11.840 --> 00:26:14.880
For example, if I execute this,

00:26:14.880 --> 00:26:18.080
I go to a section of this tutorial here

00:26:18.080 --> 00:26:20.640
that explains the main keys of eev.

00:26:20.640 --> 00:26:23.670
These things are hyperlinks.

00:26:23.670 --> 00:26:25.597
I can mark a hyperlink like this.

00:26:25.597 --> 00:26:27.286
it is just plain text.

00:26:27.286 --> 00:26:29.525
I can copy it to my notes.

00:26:29.525 --> 00:26:31.760
The idea is that every time

00:26:31.760 --> 00:26:34.016
that I find something that is
interesting,

00:26:34.016 --> 00:26:36.240
I can create a hyperlink to it.

00:26:36.240 --> 00:26:38.513
I can put these links in my notes

00:26:38.513 --> 00:26:40.799
so I can navigate back

00:26:40.799 --> 00:26:42.667
to all the interesting positions

00:26:42.667 --> 00:26:48.799
very quickly.

00:26:48.799 --> 00:26:57.600
Okay, next feature.
If we type M-J (uppercase), then

00:26:57.600 --> 00:27:00.080
this is a function that transforms

00:27:00.080 --> 00:27:03.679
the current line in a certain way.

00:27:03.679 --> 00:27:06.471
Let me give an example.
Let me isolate this.

00:27:06.471 --> 00:27:11.039
Let me duplicate this line
to make clear what happens.

00:27:11.039 --> 00:27:14.240
If I type M-J (uppercase) here,

00:27:14.240 --> 00:27:17.561
this line here becomes
the defun for eejump-6,

00:27:17.561 --> 00:27:21.200
and the target of this eejump

00:27:21.200 --> 00:27:24.799
is exactly this sexp here.

00:27:24.799 --> 00:27:28.559
Let me undo this mess.

00:27:28.559 --> 00:27:30.815
If the first word in the line

00:27:30.815 --> 00:27:32.840
is not a number... For example,

00:27:32.840 --> 00:27:36.240
here, let me do the same thing:

00:27:36.240 --> 00:27:41.200
duplicate the line and type M-J,

00:27:41.200 --> 00:27:44.014
then M-J (uppercase) converts that to

00:27:44.014 --> 00:27:49.440
a defun that defines a function
with a very short name.

00:27:49.440 --> 00:27:52.720
This function with a very short name

00:27:52.720 --> 00:27:56.720
opens this file here in the directory

00:27:56.720 --> 00:27:59.360
with the copy of the git repository

00:27:59.360 --> 00:28:01.360
for Org Mode.

00:28:01.360 --> 00:28:05.360
Let me undo the mess again.

00:28:05.360 --> 00:28:14.640
Oops. That's it.

00:28:14.640 --> 00:28:21.279
M-J (uppercase) is a particular case
of something that

00:28:21.279 --> 00:28:23.708
I use a lot in eev.

00:28:23.708 --> 00:28:28.799
eev has lots of commands that--
sorry, key sequences

00:28:28.799 --> 00:28:31.466
that are like M- uppercase letter,

00:28:31.466 --> 00:28:34.660
and almost all of them operate

00:28:34.660 --> 00:28:36.019
on the current line and

00:28:36.019 --> 00:28:37.616
transform the current line

00:28:37.616 --> 00:28:38.880
in a certain way.

00:28:38.880 --> 00:28:42.000
For example, this is a filename.

00:28:42.000 --> 00:28:45.360
If I type M-F (uppercase) here,

00:28:45.360 --> 00:28:47.967
it becomes a link to that file.

00:28:47.967 --> 00:28:50.000
This is the name of a man page.

00:28:50.000 --> 00:28:53.600
If I type M-M (uppercase) here,

00:28:53.600 --> 00:28:55.292
it converts that to the link

00:28:55.292 --> 00:28:58.080
to a manpage. This is a shell command.

00:28:58.080 --> 00:29:01.679
If I type M-S (uppercase) here,

00:29:01.679 --> 00:29:04.960
it converts that to a link to a

00:29:04.960 --> 00:29:08.720
to find-sh (shell).

00:29:08.720 --> 00:29:12.960
Until a few years ago,
these functions

00:29:12.960 --> 00:29:16.159
with M- uppercase letter were half

00:29:16.159 --> 00:29:18.880
of my main ways of creating
sexp hyperlinks

00:29:18.880 --> 00:29:20.085
with a few key strokes.

00:29:20.085 --> 00:29:22.399
In the beginning, of course,
I had to create my

00:29:22.399 --> 00:29:25.600
sexp pipelines by typing each character.

00:29:25.600 --> 00:29:28.640
But after some time, I decided that

00:29:28.640 --> 00:29:31.520
I needed something more efficient.

00:29:31.520 --> 00:29:38.480
So this is the end of part one
of the presentation.

00:29:38.480 --> 00:29:40.640
So this is part two of the presentation,

00:29:40.640 --> 00:29:42.070
and the main theme here

00:29:42.070 --> 00:29:44.320
is the standard describe-key

00:29:44.320 --> 00:29:46.320
function that comes with Emacs.

00:29:46.320 --> 00:29:49.200
My variant of it... The thing is that

00:29:49.200 --> 00:29:50.960
the standard describe-key in Emacs

00:29:50.960 --> 00:29:52.738
is user-friendly, but it is

00:29:52.738 --> 00:29:55.600
hacker-unfriendly. Well, I felt so.

00:29:55.600 --> 00:29:58.281
When I tried to complement it

00:29:58.281 --> 00:30:00.799
by writing a hacker-friendly
version of it

00:30:00.799 --> 00:30:03.919
that produced the sexp hyperlinks
that I needed,

00:30:03.919 --> 00:30:06.457
I got something that
I found really lovely.

00:30:07.039 --> 00:30:08.994
Several of the main

00:30:08.994 --> 00:30:12.480
design decisions of eev can be seen there.

00:30:12.480 --> 00:30:13.995
When I showed my variants to

00:30:13.995 --> 00:30:15.520
other people, they hated it.

00:30:15.520 --> 00:30:16.851
They felt that it was

00:30:16.851 --> 00:30:19.360
totally against their notions of

00:30:19.360 --> 00:30:23.440
user-friendliness.

00:30:23.440 --> 00:30:24.606
Okay. So let's see.

00:30:24.606 --> 00:30:26.297
The standard describe-key,

00:30:26.297 --> 00:30:30.401
if I run this hyperlink here,
I get this.

00:30:30.401 --> 00:30:31.866
The result of running

00:30:31.866 --> 00:30:34.399
describe-key on the key down...

00:30:34.399 --> 00:30:35.799
This is a big buffer

00:30:35.799 --> 00:30:38.080
with some things in italics.

00:30:38.080 --> 00:30:40.752
Some hyperlinks here.

00:30:40.752 --> 00:30:42.387
These hyperlinks are standard

00:30:42.387 --> 00:30:43.679
in the sense that

00:30:43.679 --> 00:30:45.407
the targets are not visible,

00:30:45.407 --> 00:30:47.760
and they are implemented using

00:30:47.760 --> 00:30:49.519
buttons in Emacs Lisp.

00:30:49.519 --> 00:30:52.385
This section of the Emacs Lisp manual

00:30:52.385 --> 00:30:56.799
describes how buttons work.

00:30:56.799 --> 00:31:01.957
The source code is quite difficult.

00:31:01.957 --> 00:31:04.240
I mean, when I was starting to

00:31:04.240 --> 00:31:05.721
to try to decipher this

00:31:05.721 --> 00:31:07.600
when I was a beginner

00:31:07.600 --> 00:31:11.200
using Emacs 19.34, I felt that this

00:31:11.200 --> 00:31:12.320
describe-key was

00:31:12.320 --> 00:31:15.519
very difficult to understand.

00:31:15.519 --> 00:31:20.080
I felt that the the designers,

00:31:20.080 --> 00:31:22.640
the people who wrote it,
were sacrificing

00:31:22.640 --> 00:31:24.839
too much of the hacker-friendliness

00:31:24.839 --> 00:31:27.154
that I was expecting from it

00:31:27.154 --> 00:31:31.279
to make it beginner-friendly.

00:31:31.279 --> 00:31:33.600
Let me explain. What are the problems

00:31:33.600 --> 00:31:35.511
with the standard describe-key?

00:31:35.511 --> 00:31:37.336
If we think that hyperlinks

00:31:37.336 --> 00:31:38.640
are things like this

00:31:38.640 --> 00:31:41.600
with the target and the text, then in the

00:31:41.600 --> 00:31:43.600
button hyperlinks of describe-key,

00:31:43.600 --> 00:31:46.516
these three bad things happen.

00:31:46.516 --> 00:31:49.983
First, it is hard to extract
the target from the hyperlink.

00:31:49.983 --> 00:31:52.000
Second, it is hard to recreate

00:31:52.000 --> 00:31:55.440
a list of code that would
go to that target.

00:31:55.440 --> 00:31:57.519
Third, it is hard to copy the full

00:31:57.519 --> 00:32:00.640
hyperlink, including the targets
to other buffers.

00:32:00.640 --> 00:32:04.960
I only knew how to copy the text

00:32:04.960 --> 00:32:06.937
when I was trying to decipher

00:32:06.937 --> 00:32:09.039
what describe-key was doing.

00:32:09.039 --> 00:32:11.679
I created lots of hyperlinks like this

00:32:11.679 --> 00:32:16.159
to inspect the text properties and
things like that.

00:32:16.159 --> 00:32:18.113
For example, in the description

00:32:18.113 --> 00:32:20.390
of the key down here,

00:32:20.390 --> 00:32:26.799
we have a button that points to
simple.el.

00:32:26.799 --> 00:32:29.336
The text of that button is simple.el.

00:32:29.336 --> 00:32:31.600
This hyperlink goes to the

00:32:31.600 --> 00:32:35.519
to the middle of this
button hyperlink here.

00:32:35.519 --> 00:32:39.120
This hyperlink here

00:32:39.120 --> 00:32:43.279
goes to the middle of the button
of this button hyperlink,

00:32:43.279 --> 00:32:46.240
and then inspects its text properties,

00:32:46.240 --> 00:32:51.679
and then goes to this section here
of the description.

00:32:51.679 --> 00:32:53.521
So this is a high-level description

00:32:53.521 --> 00:32:56.159
of the text properties.

00:32:56.159 --> 00:32:58.782
I mean, the text properties that make it
a button.

00:32:58.782 --> 00:33:04.320
This is a lower-level description of
these text properties.

00:33:04.320 --> 00:33:08.000
The button that points to

00:33:08.000 --> 00:33:11.440
forward-line--sorry, the button

00:33:11.440 --> 00:33:14.399
whose text is forward-line, this one is

00:33:14.399 --> 00:33:16.480
slightly different--

00:33:16.480 --> 00:33:21.200
this hyperlink here goes to the middle
of that button.

00:33:21.200 --> 00:33:25.760
This hyperlink goes to the middle of
that button,

00:33:25.760 --> 00:33:28.173
inspects its text properties,

00:33:28.173 --> 00:33:29.360
and goes to the section

00:33:29.360 --> 00:33:33.617
of this button of this help buffer here

00:33:33.617 --> 00:33:36.399
that describes the button

00:33:36.399 --> 00:33:41.679
and the lower-level view of the text
properties.

00:33:41.679 --> 00:33:45.519
So I started with things like this

00:33:45.519 --> 00:33:47.866
to understand what these buttons
were doing

00:33:47.866 --> 00:33:49.339
and I was able to figure out

00:33:49.339 --> 00:33:51.620
how these things are implemented

00:33:51.620 --> 00:33:53.120
in describe-key, and then

00:33:53.120 --> 00:33:55.519
similar help functions in Emacs.

00:33:55.519 --> 00:33:57.506
I discovered that one of the

00:33:57.506 --> 00:33:59.049
main lower-level functions

00:33:59.049 --> 00:34:01.360
that Emacs used for this

00:34:01.360 --> 00:34:05.279
is a function called
find-function-noselect.

00:34:05.279 --> 00:34:09.929
If I run find-function-noselect
on next line,

00:34:11.200 --> 00:34:14.240
it returns a pair:

00:34:14.240 --> 00:34:18.079
a cons made of a buffer and a position.

00:34:18.079 --> 00:34:20.560
So I created functions that would

00:34:21.679 --> 00:34:24.320
follow this. That would open that

00:34:24.320 --> 00:34:26.510
buffer in that position

00:34:26.510 --> 00:34:29.679
and then this is a postback list.

00:34:29.679 --> 00:34:31.679
So we could go to these positions and

00:34:31.679 --> 00:34:33.919
then search for this string, and another

00:34:33.919 --> 00:34:36.000
string, and another string, and so on.

00:34:36.000 --> 00:34:41.040
So this goes to the definition
of find-efunction

00:34:41.040 --> 00:34:45.006
and then to a string after it.

00:34:45.006 --> 00:34:48.296
I use these things to implement

00:34:48.296 --> 00:34:51.839
my own functions that pointed to the

00:34:51.839 --> 00:34:55.339
same targets as the button hyperlinks

00:34:55.339 --> 00:35:00.240
and describe-key.

00:35:00.240 --> 00:35:02.673
Again, let me show the comparison.

00:35:02.673 --> 00:35:06.322
This is the standard
describe-key here,

00:35:06.322 --> 00:35:10.480
and this is my variant.

00:35:10.480 --> 00:35:13.839
It creates a buffer with links,

00:35:13.839 --> 00:35:17.680
with the list of hyperlinks about this key.

00:35:17.680 --> 00:35:20.960
We get this. So, each one of these

00:35:20.960 --> 00:35:22.960
functions is either a blank line

00:35:22.960 --> 00:35:28.720
or an elisp hyperlink.

00:35:28.720 --> 00:35:34.506
Here is a slight variant of the
function find-ekey-links above.

00:35:34.506 --> 00:35:39.280
In this variant, the argument is a
string that has to be processed by

00:35:39.280 --> 00:35:42.400
read-kbd-macro to convert it to the

00:35:42.400 --> 00:35:45.280
lower-level format.

00:35:45.280 --> 00:35:49.040
Note that these functions here
that I wrote,

00:35:49.040 --> 00:35:50.934
they display temporary buffers

00:35:50.934 --> 00:35:53.599
with no help at all.

00:35:53.599 --> 00:35:57.131
To be honest, there's a link to

00:35:57.131 --> 00:35:58.345
a tutorial here,

00:35:58.345 --> 00:36:00.467
but this is a recent edition

00:36:00.467 --> 00:36:03.200
so let's ignore this.

00:36:03.200 --> 00:36:06.640
They display temporary buffers

00:36:06.640 --> 00:36:07.949
with no help at all,

00:36:07.949 --> 00:36:09.520
just lots of hyperlinks.

00:36:09.520 --> 00:36:11.172
And these hyperlinks can be...

00:36:11.172 --> 00:36:13.359
They are very hacker-friendly
in the sense that

00:36:13.359 --> 00:36:15.477
they can be followed with M-e.

00:36:15.477 --> 00:36:17.520
They can be copied to other

00:36:17.520 --> 00:36:19.920
buffers because they are plain text,

00:36:19.920 --> 00:36:23.680
because they are just sexp.

00:36:23.680 --> 00:36:28.000
And they can be inspected
in the sense that...

00:36:28.000 --> 00:36:32.400
For example, here,

00:36:32.400 --> 00:36:35.520
we have a hyperlink to a function
that we...

00:36:35.520 --> 00:36:37.599
It may be difficult to figure out what

00:36:37.599 --> 00:36:39.200
this function does,

00:36:39.200 --> 00:36:41.600
but we can go to that position,

00:36:41.600 --> 00:36:45.839
and then type C-h f to see the

00:36:45.839 --> 00:36:48.240
description of this function.

00:36:48.240 --> 00:36:53.890
And here is a hyperlink that does that

00:36:56.000 --> 00:37:00.160
in my syntax, say.

00:37:00.160 --> 00:37:02.800
This list of hyperlinks were

00:37:02.800 --> 00:37:08.000
generated by this code here that just

00:37:08.000 --> 00:37:11.119
used a back quote to generate

00:37:11.119 --> 00:37:14.640
lists of sexps.

00:37:14.640 --> 00:37:18.240
I felt that this function here

00:37:18.240 --> 00:37:20.700
that just generated this list

00:37:20.700 --> 00:37:23.393
was very easy to understand
and to modify,

00:37:23.393 --> 00:37:28.480
so this was hacker-friendly
in the way that I wanted.

00:37:28.480 --> 00:37:31.599
So I started using this,

00:37:31.599 --> 00:37:33.459
and this idea of using buffers

00:37:33.459 --> 00:37:36.066
with sexp hyperlinks and no help

00:37:36.066 --> 00:37:38.720
violated all the notions
of user-friendliness

00:37:38.720 --> 00:37:40.079
that I knew, so I was

00:37:40.079 --> 00:37:41.504
exploring something new

00:37:41.504 --> 00:37:46.160
at that time. This is the end of
part two.

00:37:46.160 --> 00:37:49.359
Part three of this presentation is

00:37:49.359 --> 00:37:51.735
about the killer features of eev,

00:37:51.735 --> 00:37:53.778
or why everybody should use eev

00:37:53.778 --> 00:37:55.789
or at least have eev installed

00:37:55.789 --> 00:37:59.280
even if they think that eev
is too weird.

00:37:59.280 --> 00:38:01.200
So this is a very quick listing.

00:38:01.200 --> 00:38:04.240
eev has elisp hyperlinks
which are super nice.

00:38:04.240 --> 00:38:06.050
It comes with lots of tutorials.

00:38:06.050 --> 00:38:10.800
The main one here explains all the
main features.

00:38:10.800 --> 00:38:14.079
There's also a tutorial that's

00:38:14.079 --> 00:38:18.079
an index of all the other tutorials here.

00:38:18.079 --> 00:38:20.509
Many, many, many tutorials.

00:38:20.509 --> 00:38:24.079
If we forget everything,
we can just type M-j.

00:38:24.079 --> 00:38:28.104
Remember that this part here
is beginner-friendly,

00:38:28.104 --> 00:38:32.960
and the rest is
beginner-unfriendly.

00:38:32.960 --> 00:38:38.320
There's a tutorial on Emacs Lisp here.

00:38:38.320 --> 00:38:41.920
It mainly explains how to understand

00:38:41.920 --> 00:38:44.640
Elisp code, which is much easier than...

00:38:44.640 --> 00:38:46.673
It's much easier to understand
Elisp code

00:38:46.673 --> 00:38:50.160
than to understand how to
program in Elisp.

00:38:50.160 --> 00:38:53.440
Most people are only going to need this.

00:38:53.440 --> 00:38:55.368
eev is very easy to install.

00:38:55.368 --> 00:38:58.240
It's in ELPA, so we just need to do

00:38:58.240 --> 00:39:03.520
this thing here, and it's very
non-invasive.

00:39:03.520 --> 00:39:05.472
Years ago, several years ago,

00:39:05.472 --> 00:39:07.039
it was a very invasive package,

00:39:07.039 --> 00:39:08.960
but then I changed everything.

00:39:08.960 --> 00:39:13.520
Now, if we toggle eev-mode on and off,

00:39:13.520 --> 00:39:16.320
what's going to happen is just that

00:39:16.320 --> 00:39:21.599
the eev-keymap becomes activated or
deactivated.

00:39:21.599 --> 00:39:24.720
When we install eev--

00:39:24.720 --> 00:39:27.064
I mean when we require eev,

00:39:27.064 --> 00:39:32.640
the only things that happens globally
are these things here:

00:39:32.640 --> 00:39:34.993
several functions and variables
become defined.

00:39:34.993 --> 00:39:40.079
All of them have standard prefixes,
except for one.

00:39:40.079 --> 00:39:43.040
Three characters are changed in the

00:39:43.040 --> 00:39:44.480
standard display table

00:39:44.480 --> 00:39:48.640
to make them appear as colored glyphs:

00:39:48.640 --> 00:39:52.780
the red star, the open
double angle brackets,

00:39:52.780 --> 00:39:58.160
and the closed double angle brackets.

00:39:58.160 --> 00:40:01.359
Two environment variables are set.

00:40:01.359 --> 00:40:04.560
This is a trivial technicality.

00:40:04.560 --> 00:40:10.800
We just run a defadvice around one
function that is used by "man."

00:40:10.800 --> 00:40:18.400
Also, eev has a very high
discoverability factor.

00:40:18.400 --> 00:40:22.135
There's a way to create,
a very easy way

00:40:22.135 --> 00:40:25.200
to create a hyperlink to here.

00:40:25.200 --> 00:40:27.760
I do not have time to show this now,

00:40:27.760 --> 00:40:31.200
but for example, if I'm here
in a tutorial,

00:40:31.200 --> 00:40:35.736
and I think that this section
is something interesting

00:40:35.736 --> 00:40:39.520
and I want to create a hyperlink to it,

00:40:39.520 --> 00:40:43.040
I just have to type a certain key
sequence here,

00:40:43.040 --> 00:40:45.783
and here I got a hyperlink

00:40:45.783 --> 00:40:48.269
that I can copy to my notes,

00:40:48.269 --> 00:40:52.260
and this hyperlink goes to that section.

00:40:58.240 --> 00:41:02.092
We have hyperlinks that point to
specific positions

00:41:02.092 --> 00:41:05.382
in PDF documents and in video files.

00:41:05.382 --> 00:41:09.119
Here, this one opens a PDF
and displays it.

00:41:09.119 --> 00:41:13.920
This one opens a PDF
and converts it to text.

00:41:13.920 --> 00:41:18.400
and this one opens the video in a
certain position.

00:41:18.400 --> 00:41:20.480
We also have a way to control

00:41:20.480 --> 00:41:22.079
shell-like programs.

00:41:22.079 --> 00:41:25.111
In my presentation of the last year,

00:41:25.111 --> 00:41:28.163
I spent one third of the presentation
explaining this,

00:41:28.163 --> 00:41:31.839
and I think that I gave a very good
demonstration there.

00:41:31.839 --> 00:41:35.680
The demonstration is here.

00:41:35.680 --> 00:41:37.908
We can go to the web page,

00:41:37.908 --> 00:41:41.839
go to this section of the web page,

00:41:41.839 --> 00:41:47.680
and start by this point.

00:41:47.680 --> 00:41:55.920
And here we have an explanation
and so on. Whatever.

00:41:55.920 --> 00:41:58.720
I've already mentioned this before.

00:41:59.200 --> 00:42:02.240
eev comes with a very nice Elisp
tutorial.

00:42:02.240 --> 00:42:05.599
So that's it. This is the end of part
three.

00:42:05.599 --> 00:42:08.103
So this is the last part of my
presentation,

00:42:08.103 --> 00:42:10.965
and it's about the title of the
presentation.

00:42:10.965 --> 00:42:13.599
I called the presentation, "Why

00:42:13.599 --> 00:42:16.560
Most of the Best Features in eev Look

00:42:16.560 --> 00:42:20.480
Like Five-Minute Hacks." I've already

00:42:20.480 --> 00:42:23.920
run out of time, so I have to skip this

00:42:23.920 --> 00:42:28.485
first part here in which
I describe how

00:42:28.485 --> 00:42:33.440
I was exposed to several different
notions of user-friendliness,

00:42:33.440 --> 00:42:35.920
and how the one that really blew my mind

00:42:35.920 --> 00:42:41.680
was the one in a certain
Forth environment.

00:42:41.680 --> 00:42:44.160
Let me make the long, long story

00:42:44.160 --> 00:42:46.560
very, very short.

00:42:46.560 --> 00:42:49.280
In all this process, I switched from

00:42:49.680 --> 00:42:52.960
the belief that the user was always
someone else,

00:42:52.960 --> 00:42:55.359
someone external, and that I always

00:42:55.359 --> 00:42:57.040
had to write my programs for

00:42:57.040 --> 00:43:00.079
this external user. I switched

00:43:00.079 --> 00:43:00.173
from that to the belief

00:43:00.173 --> 00:43:03.200
that I am the user.

00:43:03.200 --> 00:43:06.319
I can play with the interface
that I want.

00:43:06.319 --> 00:43:10.079
I can write programs

00:43:10.079 --> 00:43:11.786
that only I am going to understand.

00:43:11.786 --> 00:43:14.240
I can experiment with
hundreds of interfaces,

00:43:14.240 --> 00:43:16.079
select the best ones,

00:43:16.079 --> 00:43:18.720
document them, and then share them

00:43:18.720 --> 00:43:20.960
with other people

00:43:20.960 --> 00:43:24.056
who are also experimenting
with interfaces

00:43:24.056 --> 00:43:27.050
in their own ways.

00:43:27.050 --> 00:43:30.879
So eev has lots of things
that are user-friendly

00:43:30.879 --> 00:43:34.880
in these unusual ways that I've
explained before.

00:43:34.880 --> 00:43:37.160
If we consider that

00:43:37.160 --> 00:43:40.319
this notion of user-friendliness
is valid,

00:43:40.319 --> 00:43:44.651
then these things that eev implements,

00:43:44.651 --> 00:43:46.904
they are user-friendly
and hacker-friendly

00:43:46.904 --> 00:43:48.800
at the same time.

00:43:48.800 --> 00:43:50.346
Let me show one example.

00:43:51.119 --> 00:43:56.640
This is one that really took me only
five minutes to implement.

00:43:56.640 --> 00:43:59.430
At one point a few months ago,

00:43:59.430 --> 00:44:05.599
I discovered that Sacha Chua's weekly
posts about Emacs News

00:44:05.599 --> 00:44:08.800
were also being posted to a

00:44:08.800 --> 00:44:12.893
mailing list that is stored at
lists.gnu.org,

00:44:12.893 --> 00:44:16.319
and it's called emacs-tangents.

00:44:16.319 --> 00:44:19.760
I found a way to create

00:44:19.760 --> 00:44:25.440
the links to the posts in both places,

00:44:25.440 --> 00:44:28.178
but I had to use a template for that.

00:44:28.178 --> 00:44:30.640
So what we are seeing here now

00:44:30.640 --> 00:44:33.221
is a template with
the default values.

00:44:33.221 --> 00:44:38.243
So this means that we have not set the
year correctly.

00:44:38.243 --> 00:44:40.720
We have not set the month correctly,

00:44:40.720 --> 00:44:42.173
or the day correctly,

00:44:42.173 --> 00:44:45.462
but if we run this sexp here...

00:44:45.462 --> 00:44:48.960
Let me do something else before...

00:44:48.960 --> 00:44:53.359
If we run this sexp here,

00:44:53.359 --> 00:45:00.880
we change some of these entries

00:45:00.880 --> 00:45:05.200
in the template, and we get
these links here.

00:45:05.200 --> 00:45:07.719
They all work. For example,

00:45:07.719 --> 00:45:13.552
this one opens the blog post in
Sacha Chua's site,

00:45:13.552 --> 00:45:21.280
and this one opens it
in the mailing list.

00:45:21.280 --> 00:45:23.672
Sometimes I want
the Org source of that,

00:45:23.672 --> 00:45:26.520
and the easiest way
to get the Org source

00:45:26.520 --> 00:45:31.680
is to look at this link here
that has an attachment.

00:45:31.680 --> 00:45:35.839
If I take this link here,

00:45:35.839 --> 00:45:43.342
and I take this stem that points to the
attachment, and I put it here,

00:45:43.342 --> 00:45:45.440
and I generate this page again

00:45:45.440 --> 00:45:50.000
with all this data,
then I get a script here

00:45:50.000 --> 00:45:51.673
that downloads...

00:45:51.673 --> 00:45:54.640
Let me switch to a smaller font.

00:45:54.640 --> 00:45:58.160
It downloads this attachment

00:45:58.160 --> 00:46:01.599
and it renames that attachment to
something:

00:46:01.599 --> 00:46:06.000
./emacs-news -- sorry, something's...

00:46:06.000 --> 00:46:10.720
-emacs-news-something

00:46:10.720 --> 00:46:15.119
something emacs-news.org here.

00:46:15.119 --> 00:46:16.750
The file is already here,

00:46:16.750 --> 00:46:18.400
already with the right name.

00:46:18.400 --> 00:46:22.079
So I can open it with
just this hyperlink.

00:46:22.079 --> 00:46:23.780
Let me go to the big font again.

00:46:25.200 --> 00:46:28.673
And now I have the Org source
for that hyperlink--

00:46:28.673 --> 00:46:33.839
Sorry, for that blog post.

00:46:33.839 --> 00:46:37.911
And so this one-line thing here

00:46:37.911 --> 00:46:40.960
is, in a sense,

00:46:40.960 --> 00:46:45.119
a hyperlink to this blog post
in all its formats.

00:46:45.119 --> 00:46:48.640
If I execute this, I get links to

00:46:48.640 --> 00:46:52.000
all the places where it is posted,

00:46:52.000 --> 00:46:56.000
and I get a script to
download the local copy

00:46:56.000 --> 00:47:00.480
of the Org source of it. And that's it.

00:47:00.480 --> 00:47:02.506
Well, I'm already out of time,

00:47:02.506 --> 00:47:04.480
so let me finish here.

00:47:04.480 --> 00:47:10.079
Thanks. Bye.