From 100701b2eea58939d5a337c8db6c1ab871a07125 Mon Sep 17 00:00:00 2001 From: Sacha Chua Date: Fri, 22 Jan 2021 23:05:04 -0500 Subject: Add subtitles for talk21 --- ...k-like-5-minute-hacks--eduardo-ochs-autogen.vtt | 3301 -------------------- ...-eev-look-like-5-minute-hacks--eduardo-ochs.vtt | 2848 +++++++++++++++++ 2 files changed, 2848 insertions(+), 3301 deletions(-) delete mode 100644 2020/subtitles/emacsconf-2020--21-on-why-most-of-the-best-features-in-eev-look-like-5-minute-hacks--eduardo-ochs-autogen.vtt create mode 100644 2020/subtitles/emacsconf-2020--21-on-why-most-of-the-best-features-in-eev-look-like-5-minute-hacks--eduardo-ochs.vtt (limited to '2020/subtitles') diff --git a/2020/subtitles/emacsconf-2020--21-on-why-most-of-the-best-features-in-eev-look-like-5-minute-hacks--eduardo-ochs-autogen.vtt b/2020/subtitles/emacsconf-2020--21-on-why-most-of-the-best-features-in-eev-look-like-5-minute-hacks--eduardo-ochs-autogen.vtt deleted file mode 100644 index e9bcd225..00000000 --- a/2020/subtitles/emacsconf-2020--21-on-why-most-of-the-best-features-in-eev-look-like-5-minute-hacks--eduardo-ochs-autogen.vtt +++ /dev/null @@ -1,3301 +0,0 @@ -WEBVTT - -00:00:00.080 --> 00:00:02.639 -hi my name is eduardo x I'm this person - -00:00:02.639 --> 00:00:03.439 -here - -00:00:03.439 --> 00:00:06.240 -and the title of this talk is on why - -00:00:06.240 --> 00:00:07.120 -most of - -00:00:07.120 --> 00:00:09.519 -most of the best features in ev look - -00:00:09.519 --> 00:00:11.599 -like five minute hacks - -00:00:11.599 --> 00:00:13.759 -and this is a presentation at the max - -00:00:13.759 --> 00:00:15.280 -conf 2020 - -00:00:15.280 --> 00:00:23.199 -happening in november 22 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 -and here I'm going to explain some - -00:00:27.680 --> 00:00:29.840 -some ideas that are prerequisites for - -00:00:29.840 --> 00:00:31.039 -understanding the rest of the - -00:00:31.039 --> 00:00:32.320 -presentation - -00:00:32.320 --> 00:00:35.440 -the three main keys of ev are matay meta - -00:00:35.440 --> 00:00:35.760 -k - -00:00:35.760 --> 00:00:37.920 -and mata j and I'm going to start by - -00:00:37.920 --> 00:00:42.079 -explaining metae and meta k - -00:00:42.079 --> 00:00:44.960 -metae is used to follow hyperlink and - -00:00:44.960 --> 00:00:46.800 -technically it is - -00:00:46.800 --> 00:00:49.680 -essentially just a ctrl e to move to the - -00:00:49.680 --> 00:00:50.879 -end of the line and then - -00:00:50.879 --> 00:00:54.320 -a ctrl x control e to execute this the - -00:00:54.320 --> 00:00:58.960 -sext before point at the end of the line - -00:00:58.960 --> 00:01:00.879 -and the thing is that a max comes with - -00:01:00.879 --> 00:01:03.120 -many functions that can be used as sex - -00:01:03.120 --> 00:01:05.040 -hyperlinks - -00:01:05.040 --> 00:01:07.040 -we can consider that they point to - -00:01:07.040 --> 00:01:09.040 -somewhere I'm going to refer to that as - -00:01:09.040 --> 00:01:09.520 -the - -00:01:09.520 --> 00:01:11.920 -target of the hyperlink and if we - -00:01:11.920 --> 00:01:12.960 -execute this - -00:01:12.960 --> 00:01:15.759 -sex paper links would 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 demand paid 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 skilling the the current buffer - -00:01:29.840 --> 00:01:30.720 -that the hyperlink - -00:01:30.720 --> 00:01:34.400 -created 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:44.640 -we have to either - -00:01:44.640 --> 00:01:52.840 -click here or type ctrl x50 - -00:01:52.840 --> 00:01:54.880 -uh - -00:01:54.880 --> 00:01:57.520 -so here are some examples of sex - -00:01:57.520 --> 00:02:00.640 -hyperlinks using standard max functions - -00:02:00.640 --> 00:02:03.600 -this third one is uh badly behaved in a - -00:02:03.600 --> 00:02:04.880 -different way - -00:02:04.880 --> 00:02:08.879 -if executed we the target is created in - -00:02:08.879 --> 00:02:09.840 -the same window - -00:02:09.840 --> 00:02:13.840 -as we are now but it also shows a lot of - -00:02:13.840 --> 00:02:16.000 -garbage here in the aqua area so - -00:02:16.000 --> 00:02:20.840 -the the current frame becomes a bit - -00:02:20.840 --> 00:02:23.280 -messy - -00:02:23.280 --> 00:02:26.160 -and well one of the first things that I - -00:02:26.160 --> 00:02:28.319 -did when I was creating av - -00:02:28.319 --> 00:02:30.720 -many many years ago was that I created - -00:02:30.720 --> 00:02:31.680 -variants - -00:02:31.680 --> 00:02:34.840 -of all these functions that were better - -00:02:34.840 --> 00:02:36.640 -behaved - -00:02:36.640 --> 00:02:38.640 -and they were better behaved in two - -00:02:38.640 --> 00:02:40.480 -senses the obvious one - -00:02:40.480 --> 00:02:43.040 -was that they they all created the - -00:02:43.040 --> 00:02:43.680 -target - -00:02:43.680 --> 00:02:45.840 -in the same window as before so I could - -00:02:45.840 --> 00:02:48.720 -go back by just typing meta k - -00:02:48.720 --> 00:02:51.040 -which is essentially just killed this - -00:02:51.040 --> 00:02:52.879 -buffer - -00:02:52.879 --> 00:02:55.200 -and well but I also implemented - -00:02:55.200 --> 00:02:56.480 -something extra that - -00:02:56.480 --> 00:02:59.040 -are the post back lists for example for - -00:02:59.040 --> 00:02:59.840 -example these - -00:02:59.840 --> 00:03:03.599 -extra arguments here are a postback list - -00:03:03.599 --> 00:03:06.080 -and this extra arguments specify - -00:03:06.080 --> 00:03:09.599 -position and the target buffer - -00:03:09.599 --> 00:03:13.040 -and in this example this this spot - -00:03:13.040 --> 00:03:16.720 -spec list means starting from the from - -00:03:16.720 --> 00:03:18.239 -the beginning of the buffer - -00:03:18.239 --> 00:03:20.560 -search for the first occurrence of this - -00:03:20.560 --> 00:03:22.239 -string - -00:03:22.239 --> 00:03:24.159 -after that after the beginning of the - -00:03:24.159 --> 00:03:25.519 -buffer and then - -00:03:25.519 --> 00:03:28.159 -search for the first occurrence of this - -00:03:28.159 --> 00:03:29.120 -string - -00:03:29.120 --> 00:03:33.760 -after that - -00:03:33.760 --> 00:03:36.560 -eev also defines some hyperlinks that do - -00:03:36.560 --> 00:03:38.799 -not create new buffers - -00:03:38.799 --> 00:03:41.280 -uh here is the first example if I - -00:03:41.280 --> 00:03:41.840 -execute - -00:03:41.840 --> 00:03:45.920 -this one this one is a hyperlink to the - -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 uh - -00:03:50.720 --> 00:03:52.959 -but instead of showing the result in the - -00:03:52.959 --> 00:03:55.040 -new buffer the result is shown - -00:03:55.040 --> 00:03:58.959 -here so if execute to this type link - -00:03:58.959 --> 00:04:01.840 -the result of date the output of data is - -00:04:01.840 --> 00:04:04.239 -shown in the echo area and if executed - -00:04:04.239 --> 00:04:07.120 -again - -00:04:07.120 --> 00:04:09.519 -it shows the result again and the result - -00:04:09.519 --> 00:04:11.519 -changes every second - -00:04:11.519 --> 00:04:15.200 -and if so this is a variant - -00:04:15.200 --> 00:04:18.720 -of fine sh - -00:04:18.720 --> 00:04:21.840 -uh 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 -and here is an example of a hyperlink - -00:04:35.919 --> 00:04:37.520 -that - -00:04:37.520 --> 00:04:40.000 -calls an external program if execute - -00:04:40.000 --> 00:04:41.280 -this - -00:04:41.280 --> 00:04:43.759 -it it calls google chrome to open a - -00:04:43.759 --> 00:04:46.639 -certain url - -00:04:46.639 --> 00:04:51.520 -here it is let's go back to mx - -00:04:51.520 --> 00:04:55.280 -if execute this happening here - -00:04:55.280 --> 00:04:58.479 -it invokes my favorite pdf viewer which - -00:04:58.479 --> 00:04:58.880 -is - -00:04:58.880 --> 00:05:02.560 -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 this other arguments - -00:05:10.880 --> 00:05:15.199 -are ignored let me show how it works - -00:05:15.199 --> 00:05:19.120 -here it is this is a an accept from a - -00:05:19.120 --> 00:05:20.160 -book - -00:05:20.160 --> 00:05:22.639 -so page 3 and the pdf corresponds to - -00:05:22.639 --> 00:05:23.199 -page - -00:05:23.199 --> 00:05:26.400 -113 in the book and - -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 pdf to text on - -00:05:34.560 --> 00:05:36.479 -this pdf here - -00:05:36.479 --> 00:05:39.600 -and max takes the output of - -00:05:39.600 --> 00:05:42.880 -run epd after text on this pdf here - -00:05:42.880 --> 00:05:46.080 -and displays it in a buffer and now this - -00:05:46.080 --> 00:05:47.280 -postback list - -00:05:47.280 --> 00:05:50.000 -is interpreted in a different way this - -00:05:50.000 --> 00:05:51.280 -thing is interpreted - -00:05:51.280 --> 00:05:54.400 -as a as a number of a page and a max - -00:05:54.400 --> 00:05:54.800 -goes - -00:05:54.800 --> 00:05:57.520 -to page three by counting form feeds in - -00:05:57.520 --> 00:05:58.240 -the - -00:05:58.240 --> 00:06:01.440 -converted version of the pdf and then it - -00:06:01.440 --> 00:06:03.039 -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:08.479 -to see what happens - -00:06:08.479 --> 00:06:10.800 -here it is I opened the same page as - -00:06:10.800 --> 00:06:14.800 -before - -00:06:14.800 --> 00:06:18.400 -it starts with lecture one so - -00:06:18.400 --> 00:06:20.720 -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:28.160 -uh and this thing here is a hyperlink to - -00:06:28.160 --> 00:06:30.400 -video - -00:06:30.400 --> 00:06:32.720 -and when I executed it's going to open - -00:06:32.720 --> 00:06:34.560 -this video here - -00:06:34.560 --> 00:06:37.759 -at this time this time stamp let's see - -00:06:37.759 --> 00:06:41.199 -one two three one - -00:06:41.199 --> 00:06:46.840 -two three that's the way to do - -00:06:46.840 --> 00:06:49.440 -it - -00:06:49.440 --> 00:06:52.560 -and also some hyperlinks that that I - -00:06:52.560 --> 00:06:53.680 -defined - -00:06:53.680 --> 00:06:56.479 -uh they don't work like like usual - -00:06:56.479 --> 00:06:58.160 -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:13.280 -just do something to change the current - -00:07:13.280 --> 00:07:14.960 -page - -00:07:14.960 --> 00:07:18.160 -if I execute this the action of this - -00:07:18.160 --> 00:07:18.880 -function - -00:07:18.880 --> 00:07:22.240 -eek is to uh - -00:07:22.240 --> 00:07:24.800 -it interprets this string as a series of - -00:07:24.800 --> 00:07:25.919 -keys and it - -00:07:25.919 --> 00:07:28.840 -acts as if the user had typed all these - -00:07:28.840 --> 00:07:30.319 -keys so - -00:07:30.319 --> 00:07:33.680 -if executed I get a hello in the next - -00:07:33.680 --> 00:07:34.400 -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 sex here at this moment though is - -00:07:54.879 --> 00:07:55.759 -not defined - -00:07:55.759 --> 00:07:57.919 -and if I execute this mx is going to - -00:07:57.919 --> 00:08:00.000 -show me a message saying - -00:08:00.000 --> 00:08:03.599 -uh symbols 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 defund - -00:08:09.520 --> 00:08:12.960 -this the action of this function o here - -00:08:12.960 --> 00:08:16.479 -is to run this which opens a certain - -00:08:16.479 --> 00:08:18.960 -directory - -00:08:18.960 --> 00:08:21.840 -let me go back and here is another - -00:08:21.840 --> 00:08:23.039 -button that defines - -00:08:23.039 --> 00:08:25.840 -several functions at the same time if I - -00:08:25.840 --> 00:08:26.479 -execute - -00:08:26.479 --> 00:08:32.320 -this - -00:08:32.320 --> 00:08:35.599 -note that the the result of executing - -00:08:35.599 --> 00:08:36.719 -this expression - -00:08:36.719 --> 00:08:38.640 -is the name of one of the functions that - -00:08:38.640 --> 00:08:40.080 -it defined - -00:08:40.080 --> 00:08:42.800 -that is this one here and let me explain - -00:08:42.800 --> 00:08:43.360 -the - -00:08:43.360 --> 00:08:46.959 -these examples uh 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 or git file where - -00:08:51.839 --> 00:08:54.640 -this or gate in the middle of its name - -00:08:54.640 --> 00:08:55.040 -is - -00:08:55.040 --> 00:08:59.600 -exactly this first argument to code cd - -00:08:59.600 --> 00:09:02.640 -and the action of running find or get - -00:09:02.640 --> 00:09:03.120 -file - -00:09:03.120 --> 00:09:06.399 -on a string like this is that - -00:09:06.399 --> 00:09:09.680 -find or get file 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 called cd - -00:09:17.920 --> 00:09:21.760 -and then it executes find flying - -00:09:21.760 --> 00:09:25.680 -on the result which is this one - -00:09:25.680 --> 00:09:28.320 -and fine flying is my variant of find - -00:09:28.320 --> 00:09:28.800 -file - -00:09:28.800 --> 00:09:32.080 -that supports both spec lists - -00:09:32.080 --> 00:09:36.880 -and this function here that I'm - -00:09:36.880 --> 00:09:39.600 -referring to as a button it also defines - -00:09:39.600 --> 00:09:41.200 -a function called - -00:09:41.200 --> 00:09:44.880 -find audit node here where the or gate - -00:09:44.880 --> 00:09:46.080 -is the same string - -00:09:46.080 --> 00:09:50.320 -as here and this function opens a node - -00:09:50.320 --> 00:09:54.160 -of of an info manual this one - -00:09:54.160 --> 00:09:57.920 -this text here opens this node in the - -00:09:57.920 --> 00:10:00.080 -org manual - -00:10:00.080 --> 00:10:03.519 -it is equivalent to this text here - -00:10:03.519 --> 00:10:06.800 -so in the passage from this line to this - -00:10:06.800 --> 00:10:08.720 -line we prepended - -00:10:08.720 --> 00:10:11.920 -to the node name the name of the manual - -00:10:11.920 --> 00:10:15.040 -here and find node is my variant - -00:10:15.040 --> 00:10:18.160 -of this standard mx function here - -00:10:18.160 --> 00:10:20.399 -but find node also supports post - -00:10:20.399 --> 00:10:23.519 -backlists - -00:10:23.519 --> 00:10:26.640 -eevee also defines some functions that - -00:10:26.640 --> 00:10:28.640 -define shorter hyperlinks to pdfs and - -00:10:28.640 --> 00:10:30.800 -videos - -00:10:30.800 --> 00:10:32.880 -remember that this thing here is a - -00:10:32.880 --> 00:10:34.720 -shorter hyperlink to a - -00:10:34.720 --> 00:10:37.120 -to a file and this thing here is a - -00:10:37.120 --> 00:10:39.040 -shorter hyperlink to a node and - -00:10:39.040 --> 00:10:43.200 -in an mx menu in an info manual - -00:10:43.200 --> 00:10:46.079 -uh if we run this thing here this code - -00:10:46.079 --> 00:10:47.279 -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.399 -and this string this other sex - -00:10:56.399 --> 00:10:59.040 -here defines another function the first - -00:10:59.040 --> 00:11:00.240 -one defines - -00:11:00.240 --> 00:11:03.040 -the function find funcspivac page and - -00:11:03.040 --> 00:11:05.360 -the second one defines the function find - -00:11:05.360 --> 00:11:09.279 -from text when we run the - -00:11:09.279 --> 00:11:12.240 -file when we run findfoxpivotpage it - -00:11:12.240 --> 00:11:13.440 -opens - -00:11:13.440 --> 00:11:17.600 -this pdf here the name is - -00:11:17.600 --> 00:11:20.640 -quite long uh - -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:28.000 -oops sorry in this case - -00:11:28.000 --> 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:37.360 --> 00:11:42.640 -ah we got - -00:11:42.640 --> 00:11:45.200 -here it is uh the contents of a book - -00:11:45.200 --> 00:11:46.880 -that is freely - -00:11:46.880 --> 00:11:50.800 -available uh here is another page of the - -00:11:50.800 --> 00:11:51.760 -book - -00:11:51.760 --> 00:11:55.040 -and if we execute the this happening - -00:11:55.040 --> 00:11:55.519 -here - -00:11:55.519 --> 00:11:58.399 -find funk's pivot text it converts the - -00:11:58.399 --> 00:11:59.920 -pdf to text - -00:11:59.920 --> 00:12:03.040 -and it searches for the page eight - -00:12:03.040 --> 00:12:05.040 -in it and then for the string this - -00:12:05.040 --> 00:12:08.079 -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.320 -ascii version of this contents page - -00:12:20.320 --> 00:12:25.040 -here uh 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.680 -uh I have the full index somewhere but - -00:12:31.680 --> 00:12:33.600 -it's very long so I just copied a few - -00:12:33.600 --> 00:12:34.959 -lines here - -00:12:34.959 --> 00:12:38.959 -uh so this is a link to the to set - -00:12:38.959 --> 00:12:42.160 -section one chapter one this is the - -00:12:42.160 --> 00:12:45.360 -section 1.1 - -00:12:45.360 --> 00:12:48.959 -section 1.1.1 and so on - -00:12:48.959 --> 00:12:54.000 -and here is a link to the index - -00:12:54.000 --> 00:12:58.079 -and here is a part of my index - -00:12:58.079 --> 00:13:02.800 -of positions in the video that we just - -00:13:02.800 --> 00:13:03.279 -saw - -00:13:03.279 --> 00:13:05.760 -that I think that are especially - -00:13:05.760 --> 00:13:07.360 -relevant - -00:13:07.360 --> 00:13:10.639 -uh so this I believe - -00:13:10.639 --> 00:13:12.399 -hyperlink is a kind of a button that - -00:13:12.399 --> 00:13:14.160 -defines this function here - -00:13:14.160 --> 00:13:18.839 -find punch and punch into the video - -00:13:18.839 --> 00:13:27.600 -uh - -00:13:27.600 --> 00:13:31.440 -and we can also use this for video - -00:13:31.440 --> 00:13:33.360 -tutorials for example - -00:13:33.360 --> 00:13:37.200 -this is a very good tutorial on on magic - -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 magic - -00:13:48.399 --> 00:13:50.079 -these are some of the positions in the - -00:13:50.079 --> 00:13:51.839 -tutorial that I found especially - -00:13:51.839 --> 00:13:53.920 -especially relevant this is a very dense - -00:13:53.920 --> 00:13:55.600 -tutorial I had to take notes of - -00:13:55.600 --> 00:13:56.480 -everything - -00:13:56.480 --> 00:13:59.040 -and I had to watch everything things - -00:13:59.040 --> 00:14:00.800 -several times - -00:14:00.800 --> 00:14:03.440 -and for example this is a link to the - -00:14:03.440 --> 00:14:06.480 -position in the tutorial that explains - -00:14:06.480 --> 00:14:09.600 -uh how in space - -00:14:09.600 --> 00:14:12.880 -space max magic magic - -00:14:12.880 --> 00:14:17.600 -interprets space gs magic status - -00:14:17.600 --> 00:14:20.480 -let's see beginners space gs to initiate - -00:14:20.480 --> 00:14:22.320 -magic's git status - -00:14:22.320 --> 00:14:25.600 -uh you can also do that's it - -00:14:25.600 --> 00:14:28.800 -and here are some examples that I - -00:14:28.800 --> 00:14:32.160 -took from somewhere else the video - -00:14:32.160 --> 00:14:34.240 -tutorials from - -00:14:34.240 --> 00:14:43.519 -ralph koenig about org mode - -00:14:43.519 --> 00:14:45.519 -now let me show how the functions that - -00:14:45.519 --> 00:14:47.440 -define this router hyperlinks are - -00:14:47.440 --> 00:14:48.720 -implemented - -00:14:48.720 --> 00:14:51.199 -the standard ways in max to define - -00:14:51.199 --> 00:14:52.480 -functions that define - -00:14:52.480 --> 00:14:55.760 -other functions would be with macros uh - -00:14:55.760 --> 00:14:58.320 -let's see an example this is a standard - -00:14:58.320 --> 00:14:59.040 -function that - -00:14:59.040 --> 00:15:01.540 -defines new functions - -00:15:01.540 --> 00:15:02.959 -[Music] - -00:15:02.959 --> 00:15:06.959 -and if we execute it one of the res - -00:15:06.959 --> 00:15:09.040 -its result is the last function that it - -00:15:09.040 --> 00:15:10.160 -defined which is - -00:15:10.160 --> 00:15:13.920 -e-grief 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:19.360 -look at the result of macro expand which - -00:15:19.360 --> 00:15:20.880 -is going to show - -00:15:20.880 --> 00:15:23.519 -show us the result of of this of the - -00:15:23.519 --> 00:15:25.519 -expansion of this - -00:15:25.519 --> 00:15:28.000 -instead of expanding and executing it - -00:15:28.000 --> 00:15:28.959 -just - -00:15:28.959 --> 00:15:33.199 -expands and shows us the result - -00:15:33.199 --> 00:15:36.000 -here the result is a bit messy is too - -00:15:36.000 --> 00:15:37.600 -big for - -00:15:37.600 --> 00:15:40.959 -humans to understand but we can run - -00:15:40.959 --> 00:15:44.240 -this or this text here that takes that - -00:15:44.240 --> 00:15:47.519 -that result and pretty prints it - -00:15:47.519 --> 00:15:50.959 -so this is the pretty printed version of - -00:15:50.959 --> 00:15:54.000 -uh 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:09.920 -to - -00:16:09.920 --> 00:16:13.839 -the definition of cld struct - -00:16:13.839 --> 00:16:16.880 -and note that the code is huge uh - -00:16:16.880 --> 00:16:19.199 -well it's very well commented but it's - -00:16:19.199 --> 00:16:20.079 -it has - -00:16:20.079 --> 00:16:23.759 -lots of special cases it has uh - -00:16:23.759 --> 00:16:26.959 -it supports lots of constructions and so - -00:16:26.959 --> 00:16:27.920 -it's huge and - -00:16:27.920 --> 00:16:30.639 -it's very difficult to understand I mean - -00:16:30.639 --> 00:16:33.360 -I found it very difficult to understand - -00:16:33.360 --> 00:16:35.040 -and here's a link to document the - -00:16:35.040 --> 00:16:37.759 -documentation of cld struct - -00:16:37.759 --> 00:16:42.000 -here in the manual for - -00:16:42.000 --> 00:16:46.000 -cl which is a kind of support for some - -00:16:46.000 --> 00:16:50.480 -features of common lisp in the max - -00:16:50.480 --> 00:16:53.600 -so let's compare this standard way of - -00:16:53.600 --> 00:16:54.639 -defining - -00:16:54.639 --> 00:16:56.560 -functions that define new functions - -00:16:56.560 --> 00:16:58.320 -which is with macros - -00:16:58.320 --> 00:17:01.680 -with this I'm going to use a slogan - -00:17:01.680 --> 00:17:04.160 -repeatedly the slogan is I am a very bad - -00:17:04.160 --> 00:17:06.319 -programmer - -00:17:06.319 --> 00:17:08.880 -I'm a very bad programmer so when I was - -00:17:08.880 --> 00:17:10.640 -trying to create functions that would - -00:17:10.640 --> 00:17:12.240 -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:23.199 -the code cd that we saw in the previous - -00:17:23.199 --> 00:17:24.640 -section - -00:17:24.640 --> 00:17:28.079 -we can see the the code that it produces - -00:17:28.079 --> 00:17:29.039 -by - -00:17:29.039 --> 00:17:31.039 -making a copy of this line and - -00:17:31.039 --> 00:17:33.280 -prepending this string here to the name - -00:17:33.280 --> 00:17:34.480 -of the function - -00:17:34.480 --> 00:17:36.720 -so instead of running code cd we run - -00:17:36.720 --> 00:17:38.400 -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 cd would execute - -00:17:47.760 --> 00:17:50.320 -so it's a series of the fonts and a few - -00:17:50.320 --> 00:17:54.080 -set cues and so on - -00:17:54.080 --> 00:17:57.600 -and this thing is implemented mostly as - -00:17:57.600 --> 00:17:59.120 -a template - -00:17:59.120 --> 00:18:02.160 -uh the lola the - -00:18:02.160 --> 00:18:04.160 -there's an inner function called ee - -00:18:04.160 --> 00:18:06.240 -called cd 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 just runs the function - -00:18:10.640 --> 00:18:14.320 -e template zero 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 -uh 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 but - -00:18:37.280 --> 00:18:37.760 -um - -00:18:37.760 --> 00:18:39.679 -we are 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 so on - -00:18:48.480 --> 00:18:50.320 -in the beginning I said that the three - -00:18:50.320 --> 00:18:51.600 -main keys of av - -00:18:51.600 --> 00:18:56.000 -are meta e meta k and meta j - -00:18:56.000 --> 00:19:00.080 -let's see now what met what meta j does - -00:19:00.080 --> 00:19:01.520 -uh but I need to start with some - -00:19:01.520 --> 00:19:04.640 -motivation uh 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 and 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 the fund 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:21.200 -and I can invoke you invoke it with meta - -00:19:21.200 --> 00:19:21.520 -x - -00:19:21.520 --> 00:19:24.720 -e if I type meta xp - -00:19:24.720 --> 00:19:27.360 -now it opens a latex file that I'm - -00:19:27.360 --> 00:19:31.130 -working on - -00:19:31.130 --> 00:19:32.559 -[Music] - -00:19:32.559 --> 00:19:35.200 -and I create most of my latex files - -00:19:35.200 --> 00:19:37.120 -using - -00:19:37.120 --> 00:19:39.200 -template template-based functions like - -00:19:39.200 --> 00:19:40.559 -the the - -00:19:40.559 --> 00:19:43.760 -implementation of code cd above and - -00:19:43.760 --> 00:19:46.559 -this template-based functions create - -00:19:46.559 --> 00:19:49.280 -files with extension.tag - -00:19:49.280 --> 00:19:51.280 -that start with a series of the fonts - -00:19:51.280 --> 00:19:53.919 -and comments for example - -00:19:53.919 --> 00:19:56.240 -let's look at this example here if I - -00:19:56.240 --> 00:19:58.320 -execute find the attack links with this - -00:19:58.320 --> 00:19:59.440 -argument - -00:19:59.440 --> 00:20:02.159 -uh it's going it's going to do several - -00:20:02.159 --> 00:20:03.440 -things for creating a - -00:20:03.440 --> 00:20:06.880 -file called slash tmp slash forward - -00:20:06.880 --> 00:20:08.320 -attack - -00:20:08.320 --> 00:20:11.200 -and the header of that file is going to - -00:20:11.200 --> 00:20:12.400 -be this - -00:20:12.400 --> 00:20:16.080 -which starts with two and with three - -00:20:16.080 --> 00:20:19.280 -the fonts 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 2020 favorite conventions.tag - -00:20:32.799 --> 00:20:34.640 -I have this header here in which I - -00:20:34.640 --> 00:20:37.039 -define six functions with very short - -00:20:37.039 --> 00:20:39.360 -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 -this we have mnemonics for - -00:20:48.000 --> 00:20:51.520 -these short names here and 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.760 -and e is added in the sense of make a - -00:20:57.760 --> 00:20:58.159 -max - -00:20:58.159 --> 00:21:02.320 -visit that file - -00:21:02.320 --> 00:21:05.039 -okay now I can explain what is meta j - -00:21:05.039 --> 00:21:06.480 -itself - -00:21:06.480 --> 00:21:08.880 -uh we just saw comments with very short - -00:21:08.880 --> 00:21:09.600 -names - -00:21:09.600 --> 00:21:12.320 -and the idea is behind meta j is that we - -00:21:12.320 --> 00:21:14.840 -can define comments with very short - -00:21:14.840 --> 00:21:16.480 -numbers - -00:21:16.480 --> 00:21:19.679 -let me explain this uh - -00:21:19.679 --> 00:21:22.559 -the short explanation for what meta j - -00:21:22.559 --> 00:21:23.039 -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:29.760 -in particular a meta j without a numeric - -00:21:29.760 --> 00:21:30.799 -argument - -00:21:30.799 --> 00:21:33.280 -takes us to a buffer with with the basic - -00:21:33.280 --> 00:21:34.080 -help - -00:21:34.080 --> 00:21:37.679 -and a list of the current age of targets - -00:21:37.679 --> 00:21:39.760 -and 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 meta five meta j - -00:21:44.559 --> 00:21:47.919 -then meta j runs this sex - -00:21:47.919 --> 00:21:51.120 -here that is associated to - -00:21:51.120 --> 00:21:55.440 -the argument five I say that the target - -00:21:55.440 --> 00:21:59.039 -for the argument five 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 to the true - -00:22:03.760 --> 00:22:07.039 -is this sex here that opens - -00:22:07.039 --> 00:22:09.600 -well this one opens the main tutorial vv - -00:22:09.600 --> 00:22:10.240 -and this one - -00:22:10.240 --> 00:22:13.679 -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 ev to the part that explains meta j - -00:22:20.480 --> 00:22:22.559 -I've copied the the main part of the - -00:22:22.559 --> 00:22:24.559 -text here - -00:22:24.559 --> 00:22:28.159 -the header the header that meta j shows - -00:22:28.159 --> 00:22:31.360 -let me show it very quickly here - -00:22:31.360 --> 00:22:33.919 -here is their header and here is their - -00:22:33.919 --> 00:22:36.320 -rest - -00:22:36.320 --> 00:22:39.039 -the header is very beginner friendly and - -00:22:39.039 --> 00:22:40.000 -if you're a beginner - -00:22:40.000 --> 00:22:42.159 -who only knows how to use meta e to - -00:22:42.159 --> 00:22:44.559 -execute and met - -00:22:44.559 --> 00:22:46.799 -this should be okay and meta k to go - -00:22:46.799 --> 00:22:48.240 -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:59.360 -as your main starting point and every - -00:22:59.360 --> 00:23:00.799 -time that you feel lost - -00:23:00.799 --> 00:23:03.679 -you can type meta j and to go back to - -00:23:03.679 --> 00:23:04.799 -that header - -00:23:04.799 --> 00:23:07.039 -and you can use its links to navigate to - -00:23:07.039 --> 00:23:08.000 -the documentation - -00:23:08.000 --> 00:23:11.360 -for max nav let me explain that - -00:23:11.360 --> 00:23:14.799 -uh this header here has several ellis - -00:23:14.799 --> 00:23:15.679 -hyperlinks - -00:23:15.679 --> 00:23:19.039 -one here one here - -00:23:19.039 --> 00:23:22.400 -one here one here and so on - -00:23:22.400 --> 00:23:25.760 -uh 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:30.880 -find if you quick enter in the main - -00:23:30.880 --> 00:23:32.480 -tutorial and find ev - -00:23:32.480 --> 00:23:35.760 -keys intro is a kind of tutorial that is - -00:23:35.760 --> 00:23:36.720 -an index of - -00:23:36.720 --> 00:23:40.000 -the main keys - -00:23:40.000 --> 00:23:42.559 -and after that we have an explanation of - -00:23:42.559 --> 00:23:43.279 -what some - -00:23:43.279 --> 00:23:46.799 -numeric prefixes do so if we type - -00:23:46.799 --> 00:23:50.240 -met one method j the effect of that is - -00:23:50.240 --> 00:23:53.200 -exactly the same as executing this and - -00:23:53.200 --> 00:23:54.640 -we can execute this - -00:23:54.640 --> 00:24:00.159 -with meta e also - -00:24:00.159 --> 00:24:03.679 -meta tube meta j runs this sex and - -00:24:03.679 --> 00:24:06.960 -I can also execute it with meta e - -00:24:06.960 --> 00:24:10.559 -here it is it's this uh - -00:24:10.559 --> 00:24:14.240 -intro this uh - -00:24:14.240 --> 00:24:18.400 -sandbox tutorial and - -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 and then the - -00:24:27.039 --> 00:24:28.720 -documentation says that - -00:24:28.720 --> 00:24:30.880 -that header the header that is beginner - -00:24:30.880 --> 00:24:31.760 -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:37.600 -that contains a series of the fonts like - -00:24:37.600 --> 00:24:40.400 -these ones - -00:24:40.400 --> 00:24:43.440 -here the last line of the header is this - -00:24:43.440 --> 00:24:44.640 -comment here - -00:24:44.640 --> 00:24:46.720 -and then we have several defense like - -00:24:46.720 --> 00:24:48.559 -this - -00:24:48.559 --> 00:24:51.440 -let me explain how these things work - -00:24:51.440 --> 00:24:53.840 -technically what happens when we type - -00:24:53.840 --> 00:24:57.360 -meta j without any arguments is that it - -00:24:57.360 --> 00:24:57.840 -runs - -00:24:57.840 --> 00:25:00.960 -eu jump with argument neil and then - -00:25:00.960 --> 00:25:04.640 -this runs 5 e jumps - -00:25:04.640 --> 00:25:06.480 -when I run meta j with a numeric - -00:25:06.480 --> 00:25:08.000 -argument for example - -00:25:08.000 --> 00:25:11.120 -with argument 5 it runs a jump - -00:25:11.120 --> 00:25:14.400 -5 and e jump five - -00:25:14.400 --> 00:25:17.679 -uh concatenates this five one - -00:25:17.679 --> 00:25:20.400 -to make a name of a function this - -00:25:20.400 --> 00:25:21.679 -function here - -00:25:21.679 --> 00:25:24.320 -and it executes this function e jump - -00:25:24.320 --> 00:25:24.720 -five - -00:25:24.720 --> 00:25:28.880 -you jump uh dash five - -00:25:28.880 --> 00:25:31.919 -and eu jump dash five is - -00:25:31.919 --> 00:25:35.520 -executes find ev equity intro - -00:25:35.520 --> 00:25:39.360 -if I execute just meta j - -00:25:39.360 --> 00:25:41.440 -the section that shows the current age - -00:25:41.440 --> 00:25:43.919 -on targets - -00:25:43.919 --> 00:25:47.120 -has a line for e job five this is that - -00:25:47.120 --> 00:25:48.159 -is exactly the - -00:25:48.159 --> 00:25:52.400 -thing that I was explaining before - -00:25:52.400 --> 00:25:54.840 -so we can use meta j to navigate the - -00:25:54.840 --> 00:25:59.520 -tutorials and we can copy the links - -00:25:59.520 --> 00:26:03.440 -sorry we can copy links to the to - -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 ev - -00:26:20.640 --> 00:26:24.320 -and these things are hyperlinks I can - -00:26:24.320 --> 00:26:26.240 -mark a hyperlink like this it is just - -00:26:26.240 --> 00:26:27.440 -plain text and I - -00:26:27.440 --> 00:26:30.559 -can copy it to my notes and the idea is - -00:26:30.559 --> 00:26:31.760 -that every time - -00:26:31.760 --> 00:26:33.520 -every time that I find something that is - -00:26:33.520 --> 00:26:35.520 -interesting I can create a hyperlink to - -00:26:35.520 --> 00:26:36.240 -it - -00:26:36.240 --> 00:26:38.720 -and I can put these links in my notes so - -00:26:38.720 --> 00:26:40.799 -I can navigate back - -00:26:40.799 --> 00:26:42.960 -to all the interesting positions very - -00:26:42.960 --> 00:26:48.799 -quickly - -00:26:48.799 --> 00:26:51.760 -okay next feature if we type meta - -00:26:51.760 --> 00:26:54.080 -uppercase j - -00:26:54.080 --> 00:26:57.600 -uh then - -00:26:57.600 --> 00:27:00.080 -this 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.080 -let me give an example let me isolate - -00:27:06.080 --> 00:27:07.360 -this and let me create - -00:27:07.360 --> 00:27:09.919 -duplicate this line to to make clear - -00:27:09.919 --> 00:27:11.039 -what happens - -00:27:11.039 --> 00:27:14.240 -if I type meta uppercase j here - -00:27:14.240 --> 00:27:16.880 -this line here becomes the fund for a - -00:27:16.880 --> 00:27:17.440 -jump - -00:27:17.440 --> 00:27:21.200 -6 and the target of this e-jump - -00:27:21.200 --> 00:27:24.799 -is exactly this sex here - -00:27:24.799 --> 00:27:28.559 -let me undo this mess - -00:27:28.559 --> 00:27:31.360 -and if the first word in the line is not - -00:27:31.360 --> 00:27:32.840 -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:39.039 -duplicate the line and type meta - -00:27:39.039 --> 00:27:41.200 -uppercase j - -00:27:41.200 --> 00:27:44.240 -then mat uppercase j converts that to a - -00:27:44.240 --> 00:27:45.600 -defund that defines - -00:27:45.600 --> 00:27:49.440 -a function with a very short name - -00:27:49.440 --> 00:27:52.720 -and 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 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 mass again - -00:28:05.360 --> 00:28:09.120 -oops - -00:28:09.120 --> 00:28:14.640 -that's it - -00:28:14.640 --> 00:28:17.760 -meta uppercase j is a - -00:28:17.760 --> 00:28:21.279 -particular case of of something that - -00:28:21.279 --> 00:28:24.559 -I use a lot in eevee I have if he has - -00:28:24.559 --> 00:28:25.279 -lots of - -00:28:25.279 --> 00:28:28.799 -comments that sorry key sequences - -00:28:28.799 --> 00:28:31.780 -that are like meta uppercase letter and - -00:28:31.780 --> 00:28:33.200 -[Music] - -00:28:33.200 --> 00:28:35.279 -almost all of them operate on the - -00:28:35.279 --> 00:28:37.279 -current line and transform the current - -00:28:37.279 --> 00:28:38.880 -line in certain way - -00:28:38.880 --> 00:28:42.000 -for example this is a file name - -00:28:42.000 --> 00:28:45.360 -and if I type meta uppercase f here - -00:28:45.360 --> 00:28:48.640 -it becomes a link to that file this is - -00:28:48.640 --> 00:28:50.000 -the name of a month page - -00:28:50.000 --> 00:28:53.600 -and if I type meta uppercase m here - -00:28:53.600 --> 00:28:55.760 -it converts that to the link to a month - -00:28:55.760 --> 00:28:58.080 -page and this is a shell command - -00:28:58.080 --> 00:29:01.679 -and if I type meta uppercase s 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 fan shell - -00:29:08.720 --> 00:29:11.919 -and until a few years ago these - -00:29:11.919 --> 00:29:12.960 -functions - -00:29:12.960 --> 00:29:16.159 -with matter uppercase letter were half - -00:29:16.159 --> 00:29:18.080 -of my main ways of creating sex - -00:29:18.080 --> 00:29:18.880 -hyperlinks - -00:29:18.880 --> 00:29:21.039 -with few key strokes in the beginning of - -00:29:21.039 --> 00:29:22.399 -course I had to create my - -00:29:22.399 --> 00:29:25.600 -sex pipelines by typing each character - -00:29:25.600 --> 00:29:28.640 -but uh after some time and decided that - -00:29:28.640 --> 00:29:31.520 -I needed something more efficient - -00:29:31.520 --> 00:29:34.559 -so this is end of part one of the two of - -00:29:34.559 --> 00:29:34.960 -the - -00:29:34.960 --> 00:29:38.480 -presentation - -00:29:38.480 --> 00:29:40.640 -so this is part two of the presentation - -00:29:40.640 --> 00:29:41.760 -and the main theme - -00:29:41.760 --> 00:29:44.320 -here is the standard describe key - -00:29:44.320 --> 00:29:46.320 -function that comes with the max - -00:29:46.320 --> 00:29:49.200 -and my variant of it the thing is that - -00:29:49.200 --> 00:29:50.960 -the standard described key in max - -00:29:50.960 --> 00:29:53.120 -is user friendly but it is hacker - -00:29:53.120 --> 00:29:55.600 -unfriendly well I felt so - -00:29:55.600 --> 00:29:58.559 -and when I tried to complement it by by - -00:29:58.559 --> 00:30:00.799 -writing a hacker friendly version of it - -00:30:00.799 --> 00:30:03.120 -that produced the sex hyperlinks that I - -00:30:03.120 --> 00:30:03.919 -needed - -00:30:03.919 --> 00:30:05.440 -I got something that I found really - -00:30:05.440 --> 00:30:07.039 -lovely and - -00:30:07.039 --> 00:30:09.679 -several of the main designs design - -00:30:09.679 --> 00:30:12.480 -decisions of eev can be seen there - -00:30:12.480 --> 00:30:14.320 -but when I showed my variants to other - -00:30:14.320 --> 00:30:15.520 -people they hated it - -00:30:15.520 --> 00:30:17.760 -they felt that it was totally against - -00:30:17.760 --> 00:30:19.360 -their notions of - -00:30:19.360 --> 00:30:23.440 -user friendliness - -00:30:23.440 --> 00:30:25.760 -okay so let's see the standard describe - -00:30:25.760 --> 00:30:26.799 -key if I run - -00:30:26.799 --> 00:30:30.159 -this hyperlink here I get - -00:30:30.159 --> 00:30:32.399 -this the result of running the scribe - -00:30:32.399 --> 00:30:34.399 -key on the key down - -00:30:34.399 --> 00:30:36.399 -and this is a big buffer with some - -00:30:36.399 --> 00:30:38.080 -things in italics - -00:30:38.080 --> 00:30:41.360 -and some hyperlinks here these - -00:30:41.360 --> 00:30:43.120 -hyperlinks are standard in the sense - -00:30:43.120 --> 00:30:43.679 -that - -00:30:43.679 --> 00:30:46.240 -the targets are not visible and they are - -00:30:46.240 --> 00:30:47.760 -implemented using - -00:30:47.760 --> 00:30:50.799 -buttons in a max lisp this section of - -00:30:50.799 --> 00:30:51.200 -the - -00:30:51.200 --> 00:30:53.919 -mx list manual describes how buttons - -00:30:53.919 --> 00:30:56.799 -work - -00:30:56.799 --> 00:31:00.640 -and the the source code is - -00:31:00.640 --> 00:31:03.440 -quite difficult I mean when I was - -00:31:03.440 --> 00:31:04.240 -starting to - -00:31:04.240 --> 00:31:06.559 -to try to decipher this when I was a - -00:31:06.559 --> 00:31:07.600 -beginner - -00:31:07.600 --> 00:31:11.200 -using max 19.34 I felt that this - -00:31:11.200 --> 00:31:12.320 -described key was - -00:31:12.320 --> 00:31:15.519 -very difficult to understand uh - -00:31:15.519 --> 00:31:20.080 -and I felt that the the designers the - -00:31:20.080 --> 00:31:22.640 -the people who wrote it were sacrificing - -00:31:22.640 --> 00:31:23.679 -too much of the - -00:31:23.679 --> 00:31:26.159 -hacker friendliness that I was expecting - -00:31:26.159 --> 00:31:31.279 -from it to make it beginner friendly - -00:31:31.279 --> 00:31:33.600 -let me explain what are the the problems - -00:31:33.600 --> 00:31:34.799 -with the standard - -00:31:34.799 --> 00:31:36.559 -the describe key if we think that - -00:31:36.559 --> 00:31:38.640 -hyperlinks 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:47.120 -this three bad things happen first - -00:31:47.120 --> 00:31:49.120 -it is hard to extract the target from - -00:31:49.120 --> 00:31:51.200 -the hyperlink second it is hard to - -00:31:51.200 --> 00:31:52.000 -recreate - -00:31:52.000 --> 00:31:54.480 -a list of code that would go to that - -00:31:54.480 --> 00:31:55.440 -target - -00:31:55.440 --> 00:31:57.519 -and third it is hard to copy the full - -00:31:57.519 --> 00:31:59.840 -hyperlink including the targets to other - -00:31:59.840 --> 00:32:00.640 -buffers - -00:32:00.640 --> 00:32:04.960 -I only knew how to copy the text - -00:32:04.960 --> 00:32:07.279 -when I was trying to decipher what - -00:32:07.279 --> 00:32:09.039 -described key was doing - -00:32:09.039 --> 00:32:11.679 -I created lots of hyperlinks like this - -00:32:11.679 --> 00:32:12.159 -to - -00:32:12.159 --> 00:32:14.960 -inspect the text properties and things - -00:32:14.960 --> 00:32:16.159 -like that - -00:32:16.159 --> 00:32:18.480 -for example in the description of the - -00:32:18.480 --> 00:32:20.000 -key down - -00:32:20.000 --> 00:32:23.600 -here we have a button that points to - -00:32:23.600 --> 00:32:26.799 -simple dotel - -00:32:26.799 --> 00:32:29.679 -the text of that button is simple.l this - -00:32:29.679 --> 00:32:31.600 -hyperlinks goes to the - -00:32:31.600 --> 00:32:34.320 -to the middle of this button hyperlink - -00:32:34.320 --> 00:32:35.519 -here - -00:32:35.519 --> 00:32:39.120 -uh this hyperlink here - -00:32:39.120 --> 00:32:41.919 -goes to the middle of the button of this - -00:32:41.919 --> 00:32:43.279 -button hyperlink - -00:32:43.279 --> 00:32:46.240 -and then inspects its text properties - -00:32:46.240 --> 00:32:47.679 -and then goes to - -00:32:47.679 --> 00:32:51.679 -this section here of the description - -00:32:51.679 --> 00:32:53.679 -so this is a high level description of - -00:32:53.679 --> 00:32:56.159 -the text properties - -00:32:56.159 --> 00:32:58.000 -I mean the text properties that make it - -00:32:58.000 --> 00:33:00.000 -a button and this is a - -00:33:00.000 --> 00:33:02.480 -lower level description of the these - -00:33:02.480 --> 00:33:04.320 -text properties - -00:33:04.320 --> 00:33:08.000 -and the button that points to - -00:33:08.000 --> 00:33:11.440 -forward line sorry the the button that - -00:33:11.440 --> 00:33:11.919 -whose - -00:33:11.919 --> 00:33:14.399 -text is forward line this one is - -00:33:14.399 --> 00:33:16.480 -slightly different - -00:33:16.480 --> 00:33:19.039 -this hyperlink here goes to the middle - -00:33:19.039 --> 00:33:21.200 -of that button - -00:33:21.200 --> 00:33:24.559 -and this hyperlink goes to the mid to - -00:33:24.559 --> 00:33:25.760 -the middle of that button - -00:33:25.760 --> 00:33:28.559 -inspects its text properties and go to - -00:33:28.559 --> 00:33:29.360 -the section - -00:33:29.360 --> 00:33:32.559 -of this button of this help - -00:33:32.559 --> 00:33:35.760 -uh buffer here that describe the the - -00:33:35.760 --> 00:33:36.399 -button - -00:33:36.399 --> 00:33:39.120 -and the lower level view of the text - -00:33:39.120 --> 00:33:41.679 -properties - -00:33:41.679 --> 00:33:45.519 -so I started to with things like this - -00:33:45.519 --> 00:33:47.519 -to understand what these buttons were - -00:33:47.519 --> 00:33:50.159 -doing and I was able to figure out how - -00:33:50.159 --> 00:33:50.960 -these things are - -00:33:50.960 --> 00:33:53.120 -implemented and describe key and then - -00:33:53.120 --> 00:33:55.519 -similar help functions in max - -00:33:55.519 --> 00:33:57.760 -and I discovered that one of the main - -00:33:57.760 --> 00:34:00.000 -lower level functions that a max used - -00:34:00.000 --> 00:34:01.360 -for this - -00:34:01.360 --> 00:34:04.080 -is a function called find function no - -00:34:04.080 --> 00:34:05.279 -select - -00:34:05.279 --> 00:34:08.240 -if I run find function no select on next - -00:34:08.240 --> 00:34:09.929 -line - -00:34:09.929 --> 00:34:11.200 -[Music] - -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 that - -00:34:20.560 --> 00:34:21.679 -would - -00:34:21.679 --> 00:34:24.320 -uh follow this that would open that - -00:34:24.320 --> 00:34:25.119 -buffer - -00:34:25.119 --> 00:34:28.320 -in that position and then this is a - -00:34:28.320 --> 00:34:29.679 -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:40.320 -so this goes to the definition of find a - -00:34:40.320 --> 00:34:41.040 -function - -00:34:41.040 --> 00:34:44.159 -and then to a to a string - -00:34:44.159 --> 00:34:47.919 -after it and I use these things to - -00:34:47.919 --> 00:34:49.040 -implement my own - -00:34:49.040 --> 00:34:51.839 -functions that pointed to the same the - -00:34:51.839 --> 00:34:52.960 -same targets - -00:34:52.960 --> 00:34:55.440 -as the button hyperlinks and describe - -00:34:55.440 --> 00:35:00.240 -key - -00:35:00.240 --> 00:35:03.200 -again let me show the comparison this is - -00:35:03.200 --> 00:35:05.599 -the standard describe key - -00:35:05.599 --> 00:35:10.480 -here and this is my variant - -00:35:10.480 --> 00:35:13.839 -uh it creates a buffer with links - -00:35:13.839 --> 00:35:17.680 -with the list 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 a or an ellipse hyperlink - -00:35:28.720 --> 00:35:31.760 -here is a slight variant of the of the - -00:35:31.760 --> 00:35:32.880 -function - -00:35:32.880 --> 00:35:35.920 -find e key links above in this variant - -00:35:35.920 --> 00:35:38.079 -the argument is a string that has to be - -00:35:38.079 --> 00:35:39.280 -processed by - -00:35:39.280 --> 00:35:42.400 -read cbd macro to convert it to the - -00:35:42.400 --> 00:35:45.280 -lower level format - -00:35:45.280 --> 00:35:48.160 -and note that these functions here that - -00:35:48.160 --> 00:35:49.040 -I wrote - -00:35:49.040 --> 00:35:51.440 -they display temporary buffers with no - -00:35:51.440 --> 00:35:53.599 -help at all - -00:35:53.599 --> 00:35:57.359 -uh to be honest there's a link to a - -00:35:57.359 --> 00:35:58.560 -tutorial here but - -00:35:58.560 --> 00:36:01.680 -this is a recent edition so let's ignore - -00:36:01.680 --> 00:36:03.200 -this - -00:36:03.200 --> 00:36:06.640 -uh they they display temporary buffers - -00:36:06.640 --> 00:36:08.320 -with no help at all just lots of - -00:36:08.320 --> 00:36:09.520 -hyperlinks - -00:36:09.520 --> 00:36:11.599 -and these hyperlinks can be they are - -00:36:11.599 --> 00:36:13.359 -very hacker friendly in the sense that - -00:36:13.359 --> 00:36:15.040 -they can be followed with - -00:36:15.040 --> 00:36:17.520 -metae 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 sex - -00:36:23.680 --> 00:36:26.240 -and they can be inspected in the sense - -00:36:26.240 --> 00:36:28.000 -that - -00:36:28.000 --> 00:36:32.400 -for example here - -00:36:32.400 --> 00:36:34.079 -we have a hyperlink to a function that - -00:36:34.079 --> 00:36:35.520 -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:42.320 -but we can go to that position and then - -00:36:42.320 --> 00:36:45.839 -type ctrl h f to see the descript - -00:36:45.839 --> 00:36:48.240 -description of this function - -00:36:48.240 --> 00:36:52.400 -and here is a hyperlink to - -00:36:52.400 --> 00:36:53.890 -the does that - -00:36:53.890 --> 00:36:56.000 -[Music] - -00:36:56.000 --> 00:37:00.160 -in my syntax say - -00:37:00.160 --> 00:37:02.800 -and this list of hyperlinks were - -00:37:02.800 --> 00:37:04.480 -generated by - -00:37:04.480 --> 00:37:08.000 -this code here that just just uh - -00:37:08.000 --> 00:37:11.119 -used a back quote to to generate - -00:37:11.119 --> 00:37:14.640 -lists of sex - -00:37:14.640 --> 00:37:18.240 -and I I felt that this function here - -00:37:18.240 --> 00:37:21.040 -uh that just generated this list was - -00:37:21.040 --> 00:37:22.160 -very easy to understand - -00:37:22.160 --> 00:37:24.960 -and to modify so this was hacker - -00:37:24.960 --> 00:37:28.480 -friendly in the way that I wanted - -00:37:28.480 --> 00:37:31.599 -and so I started using this - -00:37:31.599 --> 00:37:34.079 -and this idea of using buffers with sex - -00:37:34.079 --> 00:37:36.800 -fiber links and no help violated - -00:37:36.800 --> 00:37:38.720 -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:42.000 -exploring some something new at that - -00:37:42.000 --> 00:37:46.160 -time and this is the end of part two - -00:37:46.160 --> 00:37:49.359 -part three of this presentation is uh - -00:37:49.359 --> 00:37:52.240 -about the killer features of ev or why - -00:37:52.240 --> 00:37:54.800 -everybody should use av or at least have - -00:37:54.800 --> 00:37:57.920 -eev installed even if they think the tv - -00:37:57.920 --> 00:37:59.280 -is too weird - -00:37:59.280 --> 00:38:01.440 -so this is a very quick listing eevee - -00:38:01.440 --> 00:38:03.440 -has lease hyperlinks which are super - -00:38:03.440 --> 00:38:04.240 -nice - -00:38:04.240 --> 00:38:06.560 -it comes with lots of tutorials the main - -00:38:06.560 --> 00:38:07.599 -one here - -00:38:07.599 --> 00:38:10.800 -explains all the main features - -00:38:10.800 --> 00:38:14.079 -uh there's also a tutorial with that's - -00:38:14.079 --> 00:38:15.040 -an index of - -00:38:15.040 --> 00:38:18.079 -all the other tutorials here - -00:38:18.079 --> 00:38:21.680 -many many many tutorials uh if we forget - -00:38:21.680 --> 00:38:24.079 -everything we can just type meta j - -00:38:24.079 --> 00:38:27.280 -and remember that this this part here is - -00:38:27.280 --> 00:38:28.880 -beginner friendly and the rest is - -00:38:28.880 --> 00:38:30.839 -beginner - -00:38:30.839 --> 00:38:32.960 -unfriendly - -00:38:32.960 --> 00:38:38.320 -there's a tutorial on max list here - -00:38:38.320 --> 00:38:41.920 -it mainly explains how to understand - -00:38:41.920 --> 00:38:44.640 -a lisp code which is much easier than - -00:38:44.640 --> 00:38:46.320 -it's much easier to understand the lisp - -00:38:46.320 --> 00:38:47.040 -code and - -00:38:47.040 --> 00:38:48.800 -then to understand how to program in a - -00:38:48.800 --> 00:38:50.160 -lisp and - -00:38:50.160 --> 00:38:53.440 -most people are only going to need this - -00:38:53.440 --> 00:38:55.920 -uh ev is very easy to install it's in - -00:38:55.920 --> 00:38:58.240 -helper so we just need to do - -00:38:58.240 --> 00:39:00.560 -this thing here and it's very - -00:39:00.560 --> 00:39:03.520 -non-invasive - -00:39:03.520 --> 00:39:06.079 -uh years ago several years ago it was a - -00:39:06.079 --> 00:39:08.000 -very invasive package but then I changed - -00:39:08.000 --> 00:39:08.960 -everything - -00:39:08.960 --> 00:39:13.520 -now uh if we toggle ev mode on and off - -00:39:13.520 --> 00:39:16.640 -what's going to happen is just that the - -00:39:16.640 --> 00:39:20.000 -evk map key map becomes activated or - -00:39:20.000 --> 00:39:21.599 -deactivated - -00:39:21.599 --> 00:39:24.720 -and when we install the evita - -00:39:24.720 --> 00:39:28.320 -I mean when we require the only things - -00:39:28.320 --> 00:39:28.640 -that - -00:39:28.640 --> 00:39:32.640 -happens globally distance here - -00:39:32.640 --> 00:39:34.480 -several functions and variables become - -00:39:34.480 --> 00:39:36.240 -defined all of them have - -00:39:36.240 --> 00:39:40.079 -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.079 -the red star and two and the open - -00:39:52.079 --> 00:39:54.160 -double angle brackets and the closed - -00:39:54.160 --> 00:39:58.160 -double angle brackets - -00:39:58.160 --> 00:40:01.359 -and two environment variables are set - -00:40:01.359 --> 00:40:04.560 -and this is a trivial technicality - -00:40:04.560 --> 00:40:07.599 -we just run a def advice - -00:40:07.599 --> 00:40:10.160 -around one function that that is used by - -00:40:10.160 --> 00:40:10.800 -man - -00:40:10.800 --> 00:40:14.240 -justice also - -00:40:14.240 --> 00:40:16.720 -eevee has a very high discoverability - -00:40:16.720 --> 00:40:18.400 -factor - -00:40:18.400 --> 00:40:21.839 -and there's a way to create a very easy - -00:40:21.839 --> 00:40:25.200 -way to create a hyperlink to here - -00:40:25.200 --> 00:40:27.760 -uh I do not have time to show this now - -00:40:27.760 --> 00:40:29.760 -but for example if I'm - -00:40:29.760 --> 00:40:32.960 -here in a tutorial and I think that that - -00:40:32.960 --> 00:40:34.480 -this - -00:40:34.480 --> 00:40:36.240 -section is something interesting and I - -00:40:36.240 --> 00:40:39.520 -want to create a hyperlink to it - -00:40:39.520 --> 00:40:41.200 -I just have to type a certain key - -00:40:41.200 --> 00:40:43.040 -sequence here - -00:40:43.040 --> 00:40:46.800 -and here I got a hyperlink that I can - -00:40:46.800 --> 00:40:50.400 -copy to my notes and this hyperlink goes - -00:40:50.400 --> 00:40:52.260 -to that section - -00:40:52.260 --> 00:40:58.240 -[Music] - -00:40:58.240 --> 00:41:00.720 -we have hyperlinks that point to - -00:41:00.720 --> 00:41:02.319 -specific positions in - -00:41:02.319 --> 00:41:05.839 -pdf documents and nvidia files here - -00:41:05.839 --> 00:41:09.119 -this one opens a pdf and displays it - -00:41:09.119 --> 00:41:09.680 -this one - -00:41:09.680 --> 00:41:13.920 -opens a pdf and converts it to text - -00:41:13.920 --> 00:41:16.720 -and this one opens the video in a - -00:41:16.720 --> 00:41:18.400 -certain position - -00:41:18.400 --> 00:41:20.480 -and 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.280 -uh in my presentation of the last year I - -00:41:25.280 --> 00:41:27.440 -spent one third of the presentation - -00:41:27.440 --> 00:41:29.520 -explaining this and I think that I gave - -00:41:29.520 --> 00:41:31.839 -a very good demonstration there - -00:41:31.839 --> 00:41:35.680 -the demonstration is here - -00:41:35.680 --> 00:41:38.800 -we can go to the web page and go to - -00:41:38.800 --> 00:41:41.839 -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:51.440 -and here we have an explanation and so - -00:41:51.440 --> 00:41:55.920 -on whatever - -00:41:55.920 --> 00:41:58.720 -and I've already mentioned this before - -00:41:58.720 --> 00:41:59.200 -uh - -00:41:59.200 --> 00:42:01.119 -eevee comes with a very nice elise - -00:42:01.119 --> 00:42:02.240 -tutorial - -00:42:02.240 --> 00:42:04.240 -so that's it this is the end of part - -00:42:04.240 --> 00:42:05.599 -three - -00:42:05.599 --> 00:42:07.359 -so this is the last part of my - -00:42:07.359 --> 00:42:09.839 -presentation and it's about the title of - -00:42:09.839 --> 00:42:10.160 -the - -00:42:10.160 --> 00:42:11.839 -the presentation I called the - -00:42:11.839 --> 00:42:13.599 -presentation why - -00:42:13.599 --> 00:42:16.560 -most of the best features in eevee look - -00:42:16.560 --> 00:42:16.960 -like - -00:42:16.960 --> 00:42:20.480 -like five minute hacks uh I've already - -00:42:20.480 --> 00:42:20.960 -run off - -00:42:20.960 --> 00:42:23.920 -out of time so I have to to skip this - -00:42:23.920 --> 00:42:24.800 -first - -00:42:24.800 --> 00:42:28.720 -part here in which I describe how I - -00:42:28.720 --> 00:42:31.280 -was exposed to several different notions - -00:42:31.280 --> 00:42:33.440 -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:37.119 -was the one in - -00:42:37.119 --> 00:42:41.680 -in a certain uh fought environment - -00:42:41.680 --> 00:42:44.160 -uh and 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 -uh in all this process I switched from - -00:42:49.280 --> 00:42:49.680 -from - -00:42:49.680 --> 00:42:52.079 -the belief that the user was always - -00:42:52.079 --> 00:42:52.960 -someone else - -00:42:52.960 --> 00:42:55.359 -someone external and that 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:02.240 -from from that to the belief that I am - -00:43:02.240 --> 00:43:03.200 -the user - -00:43:03.200 --> 00:43:05.839 -and I can play with the interface that I - -00:43:05.839 --> 00:43:07.040 -want I can - -00:43:07.040 --> 00:43:10.079 -write programs which that - -00:43:10.079 --> 00:43:12.079 -that only I am going to understand I can - -00:43:12.079 --> 00:43:14.240 -experiment with hundreds of interfaces - -00:43:14.240 --> 00:43:16.079 -and then select the best ones - -00:43:16.079 --> 00:43:18.720 -and document them and then share them - -00:43:18.720 --> 00:43:20.960 -with other people - -00:43:20.960 --> 00:43:23.520 -who are also experimenting with - -00:43:23.520 --> 00:43:24.720 -interfaces in their - -00:43:24.720 --> 00:43:28.880 -own ways and so eevee has - -00:43:28.880 --> 00:43:31.119 -lots of things that are user-friendly in - -00:43:31.119 --> 00:43:33.440 -these unusual ways that I've explained - -00:43:33.440 --> 00:43:34.880 -before - -00:43:34.880 --> 00:43:37.760 -and uh and if we disconsider that this - -00:43:37.760 --> 00:43:40.319 -notion of user friendliness is valid - -00:43:40.319 --> 00:43:44.079 -then this implement these things that av - -00:43:44.079 --> 00:43:45.119 -implement they are - -00:43:45.119 --> 00:43:47.280 -user friendly and hacker friendly at the - -00:43:47.280 --> 00:43:48.800 -same time - -00:43:48.800 --> 00:43:51.119 -and let me show one example this is one - -00:43:51.119 --> 00:43:51.920 -this is - -00:43:51.920 --> 00:43:54.640 -one that really took me one only five - -00:43:54.640 --> 00:43:56.640 -minutes to implement - -00:43:56.640 --> 00:43:59.599 -uh at one point a few months ago I - -00:43:59.599 --> 00:44:00.640 -discovered - -00:44:00.640 --> 00:44:04.240 -that sasha chewer's weekly posts about - -00:44:04.240 --> 00:44:05.599 -the max news - -00:44:05.599 --> 00:44:08.800 -had uh were also being posted to a - -00:44:08.800 --> 00:44:11.440 -mailing list that is stored at - -00:44:11.440 --> 00:44:14.800 -lists.we know.org and it's called max - -00:44:14.800 --> 00:44:16.319 -dungeons - -00:44:16.319 --> 00:44:19.280 -uh and I just and I found a way to - -00:44:19.280 --> 00:44:19.760 -create - -00:44:19.760 --> 00:44:25.440 -the links to to the posts in both places - -00:44:25.440 --> 00:44:28.400 -but I had to use a template for that so - -00:44:28.400 --> 00:44:30.640 -what we are seeing here now - -00:44:30.640 --> 00:44:32.560 -is a template with the the default - -00:44:32.560 --> 00:44:36.640 -values so this means that we have not uh - -00:44:36.640 --> 00:44:39.359 -set the year correctly we have not set - -00:44:39.359 --> 00:44:40.720 -the month correctly - -00:44:40.720 --> 00:44:44.240 -or the day correctly but if we run this - -00:44:44.240 --> 00:44:44.720 -text - -00:44:44.720 --> 00:44:48.960 -here uh let me do something else before - -00:44:48.960 --> 00:44:53.359 -if we run this text here - -00:44:53.359 --> 00:44:57.280 -which we change some of these - -00:44:57.280 --> 00:45:00.880 -entries in the - -00:45:00.880 --> 00:45:04.400 -in the template and we get these links - -00:45:04.400 --> 00:45:05.200 -here - -00:45:05.200 --> 00:45:09.119 -they all work for example this one opens - -00:45:09.119 --> 00:45:12.160 -uh the blog post in in session sasha - -00:45:12.160 --> 00:45:12.800 -chewers - -00:45:12.800 --> 00:45:16.000 -site and this one - -00:45:16.000 --> 00:45:21.280 -opens it in the mailing list - -00:45:21.280 --> 00:45:23.440 -and sometimes I want the org source of - -00:45:23.440 --> 00:45:25.760 -that and the easiest way to get the word - -00:45:25.760 --> 00:45:27.280 -source is to - -00:45:27.280 --> 00:45:30.480 -look at this link here that has an - -00:45:30.480 --> 00:45:31.680 -attachment - -00:45:31.680 --> 00:45:35.040 -and if I take this - -00:45:35.040 --> 00:45:38.560 -link here and I take this - -00:45:38.560 --> 00:45:42.319 -stem that points to to the attachment - -00:45:42.319 --> 00:45:44.480 -and I put it here and I generate this - -00:45:44.480 --> 00:45:45.440 -page again - -00:45:45.440 --> 00:45:49.119 -with all this data then I get a script - -00:45:49.119 --> 00:45:50.000 -here - -00:45:50.000 --> 00:45:53.359 -that downloads let me switch to a - -00:45:53.359 --> 00:45:54.640 -smaller font - -00:45:54.640 --> 00:45:58.160 -it downloads this attachment - -00:45:58.160 --> 00:46:00.960 -and it renames that attachment to - -00:46:00.960 --> 00:46:01.599 -something - -00:46:01.599 --> 00:46:06.000 -dot slash nx news sorry some things - -00:46:06.000 --> 00:46:10.720 -uh iphone mx news hyphen - -00:46:10.720 --> 00:46:15.119 -something mxnews.org here - -00:46:15.119 --> 00:46:17.599 -the file is already here already with - -00:46:17.599 --> 00:46:18.400 -the right name - -00:46:18.400 --> 00:46:21.359 -so I can open it with just this - -00:46:21.359 --> 00:46:22.079 -hyperlink - -00:46:22.079 --> 00:46:23.780 -let me go to the big font again - -00:46:23.780 --> 00:46:25.200 -[Music] - -00:46:25.200 --> 00:46:28.079 -and now I have the work source for that - -00:46:28.079 --> 00:46:29.280 -hyperlink - -00:46:29.280 --> 00:46:33.839 -sorry for that blog post - -00:46:33.839 --> 00:46:37.040 -and so this one line thing - -00:46:37.040 --> 00:46:40.960 -here is in a sense - -00:46:40.960 --> 00:46:43.920 -a a to to this blog post in all its - -00:46:43.920 --> 00:46:45.119 -formats - -00:46:45.119 --> 00:46:48.640 -uh if I execute this I get links to - -00:46:48.640 --> 00:46:52.000 -to all the places where it is posted - -00:46:52.000 --> 00:46:54.400 -and I get a hype and I get a script to - -00:46:54.400 --> 00:46:56.000 -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:03.200 -well I'm already out of time so let me - -00:47:03.200 --> 00:47:04.480 -finish here - -00:47:04.480 --> 00:47:10.079 -thanks bye diff --git a/2020/subtitles/emacsconf-2020--21-on-why-most-of-the-best-features-in-eev-look-like-5-minute-hacks--eduardo-ochs.vtt b/2020/subtitles/emacsconf-2020--21-on-why-most-of-the-best-features-in-eev-look-like-5-minute-hacks--eduardo-ochs.vtt new file mode 100644 index 00000000..530b95c8 --- /dev/null +++ b/2020/subtitles/emacsconf-2020--21-on-why-most-of-the-best-features-in-eev-look-like-5-minute-hacks--eduardo-ochs.vtt @@ -0,0 +1,2848 @@ +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. -- cgit v1.2.3