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.