- +NOTE Introduction + +00:00:00.000 --> 00:00:02.359 +Hi, my name is Eduardo Ochs, + +00:00:02.360 --> 00:00:06.639 +and this is my video for the EmacsConf 2025. + +00:00:06.640 --> 00:00:09.799 +Its title is Some Problems of Modernizing Emacs, + +00:00:09.800 --> 00:00:12.839 +and that is the same title as a video + +00:00:12.840 --> 00:00:16.199 +that I tried to record in March. + +00:00:16.200 --> 00:00:19.879 +But my video from March had a good "beginning" and a bad "rest", + +00:00:19.880 --> 00:00:23.759 +and I thought, I can't release that because the rest is very bad. + +00:00:23.760 --> 00:00:27.919 +I need to replace... to re-record the last part of the video. + +00:00:27.920 --> 00:00:29.759 +But I never did that. + +00:00:29.760 --> 00:00:33.199 +So this video is going to be the first 12 minutes + +00:00:33.200 --> 00:00:37.959 +of that other video, with another ending. + +00:00:37.960 --> 00:00:41.439 +And in this other ending, I'm going to show some things + +00:00:41.440 --> 00:00:46.639 +that are very easy to test. And, if people are interested, + +00:00:46.640 --> 00:00:51.799 +then the rest of the old video will make more sense. + +00:00:51.800 --> 00:00:55.059 +Anyway, let me start.
Hi! My name is Eduardo Ochs. I'm the @@ -17,6 +61,8 @@ the title of this video is
"Some problems of modernizing Emacs". +NOTE The main themes of this video +
Here is a summary of the main themes @@ -78,11 +124,13 @@ I will also show how to display better "inner views" of Emacs objects...
-I'm going to Define what is an inner view, +I'm going to define what is an inner view,
of course. +NOTE Inner views of Emacs objects +
The main trick is that we are going @@ -90,13 +138,13 @@ The main trick is that we are going to use one of the ways of displaying
-internal objects, that is the `cl-print' +internal objects, that is the `cl-print`
family of functions, for example,
-`cl-prin1-to-string', and here are some +`cl-prin1-to-string`, and here are some
examples of the kind of output that we @@ -108,16 +156,18 @@ are going to see... for example, if we run these two lines
-here the first line defines a function `foo' +here the first line defines a function `foo`
-and the second line sets `o' to the +and the second line sets `o` to the
-internal view of the definition of `foo'. +internal view of the definition of `foo`. + +NOTE Older Emacses
-In older Emacses `o' would be just a +In older Emacses `o` would be just a
list that looks... that would look very @@ -129,7 +179,7 @@ similar to this line here... but in newer Emacses the result of this - I mean, the
-the contents of `o' is this thing here, +the contents of `o` is this thing here,
that looks quite different @@ -144,10 +194,10 @@ So, in older Emacses the contents of the
-function cell of `o'... +function cell of `o`...
-sorry, of the function cell of `foo', +sorry, of the function cell of `foo`,
would be an "old-style lambda", @@ -155,6 +205,8 @@ would be an "old-style lambda",
that would be just a list like this... +NOTE Newer Emacses +
and in newer Emacses uh the contents of O would @@ -195,7 +247,7 @@ printed representation is this one, that is generated by a family of functions with
-names like `prin1'... +names like `prin1`...
and the second semicanonical printed @@ -210,16 +262,16 @@ it looks like a list... it looks somewhat like this definition
-of `foo' here, but it has this +of `foo` here, but it has this
-`:dynbind' symbol here... +`:dynbind` symbol here...
and it turns out that when we use
-the `cl-print' family of functions we can +the `cl-print` family of functions we can
reconfigure how things are printed... @@ -237,7 +289,7 @@ and one of the ways is going to be like this.
-We can also use the `cl-print' +We can also use the `cl-print`
functions with my indentation tricks to @@ -258,7 +310,7 @@ This is what Emacs considers as being the definition of the type
-`cl-structure-class', +`cl-structure-class`,
class and it is this big thing here. @@ -267,10 +319,12 @@ class and it is this big thing here. I edited it very lightly...
-I just uh deleted some line breaks here. +I just deleted some line breaks here. + +NOTE Help buttons
-And another thing that I want to to +And another thing that I want to
explain is that Emacs @@ -306,10 +360,10 @@ this type here, that we just saw in its internal view here...
-we can run either `describe-type' +we can run either `describe-type`
-or my variant of `describe-type', +or my variant of `describe-type`,
and we get a help buffer @@ -353,6 +407,8 @@ and what I'm trying to do to
overcome these problems... +NOTE "Anyone can learn Lisp in one day" +
One of my slogans in this video @@ -423,7 +479,7 @@ and another one is its "value as a function"... and if we run this we store 42
-in the "value cell" of the symbol `foo', and +in the "value cell" of the symbol `foo`, and
if we run this defun here it stores a @@ -432,7 +488,7 @@ if we run this defun here it stores a certain anonymous function in the
-"function cell" of the symbol `foo'... +"function cell" of the symbol `foo`...
and in Emacs, until some time ago @@ -483,13 +539,13 @@ this expression here, (foo foo)... Emacs would do this: it would
-replace the first `foo' by this +replace the first `foo` by this
anonymous function here, it would replace
-the second `foo' by the value of `foo' as a +the second `foo` by the value of `foo` as a
variable, that is 42, @@ -515,6 +571,8 @@ Let me show... let me talk
a bit more about why... +NOTE Lambdas for beginners broken +
the title of this slide is @@ -624,7 +682,7 @@ open black boxes like this... they could try to see what was in the
-function cell of the symbol `foo'... +function cell of the symbol `foo`...
and they would see something elegant and @@ -650,29 +708,26 @@ very difficult to understand...
and now our beginners are overwhelmed
-instead of mind-blown. -
-Note that I said "black box" here. +00:11:44.000 --> 00:11:48.000 +instead of mind-blown. Note that I said "black box" here.
Let me explain the term.
-We can open what's inside of `foo'... +We can open what's inside of `foo`...
-we can open `foo' to see the contents of +we can open `foo` to see the contents of
-the symbol `foo', and we can try to see +the symbol `foo`, and we can try to see
what's in the function cell of the
-symbol `foo'... +symbol `foo`...
so we can open the box, but what we get @@ -722,6 +777,645 @@ as the ones that we had before.
Anyway...
- +NOTE Demo + +00:12:59.302 --> 00:13:00.599 +In the beginning of the video, + +00:13:00.600 --> 00:13:02.879 +I said that I was going to replace + +00:13:02.880 --> 00:13:06.359 +the second part of my video from March + +00:13:06.360 --> 00:13:08.799 +by something that was very easy to test. + +00:13:08.800 --> 00:13:11.839 +So this is a quick demo for the _very_ impatient. + +00:13:11.840 --> 00:13:16.919 +I'm recording this in December for the EmacsConf 2025. + +00:13:16.920 --> 00:13:18.999 +This is the demo that I'm going to present. + +00:13:19.000 --> 00:13:21.759 +The idea is that people can run the demo a first time + +00:13:21.760 --> 00:13:24.399 +just to check that everything works + +00:13:24.400 --> 00:13:27.559 +and to have a notion of how things look like, + +00:13:27.560 --> 00:13:29.239 +and then, in a second moment, + +00:13:29.240 --> 00:13:32.279 +they can rerun the demo more slowly + +00:13:32.280 --> 00:13:34.879 +to understand what each step does. + +00:13:34.880 --> 00:13:38.799 +So... we are in a file called "00-try-this"... + +00:13:38.800 --> 00:13:42.199 +and the idea is that we can execute most of this file + +00:13:42.200 --> 00:13:45.359 +just by typing `f8`​s in the right places. + +00:13:45.360 --> 00:13:47.479 +Remember that when we type `f8` + +00:13:47.480 --> 00:13:49.839 +on a line that starts with two red stars, + +00:13:49.840 --> 00:13:53.199 +eev treats that line as a comment. + +00:13:53.200 --> 00:13:58.007 +So I'm going to start here... Note that it says in the bottom + +00:13:58.008 --> 00:13:59.740 +of the screen that this is a comment. + +00:13:59.741 --> 00:14:09.879 +We are going to run this to download some files... + +00:14:09.880 --> 00:14:12.959 +Now the files are there... + +00:14:12.960 --> 00:14:17.319 +This `find-2a` here shows a certain file + +00:14:17.320 --> 00:14:19.159 +at the window at the right, + +00:14:19.160 --> 00:14:22.479 +but we don't need to pay attention to that. + +00:14:22.480 --> 00:14:24.199 +And this thing `load`​s that file. + +00:14:24.200 --> 00:14:27.519 +So when we load that file, it defines some functions here + +00:14:27.520 --> 00:14:29.799 +that are going to be used by the rest of the examples. + +00:14:29.800 --> 00:14:34.019 +Now we can run this thing here... Note that + +00:14:34.020 --> 00:14:34.879 +we just defined some functions + +00:14:34.880 --> 00:14:39.359 +and then we ran these functions here... `find-eoutput-2a`... + +00:14:39.360 --> 00:14:42.679 +and they show some things in the window at the right. + +00:14:42.680 --> 00:14:45.679 +These things are boring. + +00:14:45.680 --> 00:14:49.679 +When we run `adt-insert` with argument 42, + +00:14:49.680 --> 00:14:52.399 +it just shows a 42, in this way... + +00:14:52.400 --> 00:14:55.639 +The other ones show other numbers... and so on. + +00:14:55.640 --> 00:14:59.479 +And... what happens when we modify + +00:14:59.480 --> 00:15:02.359 +this function here, `adt-2`, + +00:15:02.360 --> 00:15:05.199 +by adding and removing advices to it? + +00:15:05.200 --> 00:15:06.919 +The idea is that people can run + +00:15:06.920 --> 00:15:08.679 +this thing here several times, + +00:15:08.680 --> 00:15:10.799 +watching the window at the right, + +00:15:10.800 --> 00:15:14.719 +because the results are going to be shown there. + +00:15:14.720 --> 00:15:17.799 +So, in the first moment, when we run... + +00:15:17.800 --> 00:15:21.679 +no, no, sorry, sorry, let me run it again. + +00:15:21.680 --> 00:15:24.039 +In the first moment when we run `adt-2` + +00:15:24.040 --> 00:15:28.239 +it just shows a 2, and then we modify it in a certain way, + +00:15:28.240 --> 00:15:29.479 +and we run it again, + +00:15:29.480 --> 00:15:33.799 +and now before showing the 2 it shows a 1, mysteriously, + +00:15:33.800 --> 00:15:37.119 +and then we add something to be run after the 2, + +00:15:37.120 --> 00:15:38.479 +And we run it again, + +00:15:38.480 --> 00:15:41.839 +and now `adt-2` shows these three things. + +00:15:41.840 --> 00:15:43.959 +And then we remove the advices, + +00:15:43.960 --> 00:15:45.159 +we remove these other things, + +00:15:45.160 --> 00:15:49.079 +and when we run `adt-2` again, it shows only `;; --> 2`. + +00:15:49.080 --> 00:15:51.879 +It's impossible to understand that in the first time, + +00:15:51.880 --> 00:15:57.879 +so we can run that several times... to see how things work. + +00:15:57.880 --> 00:16:02.279 +And now we want to understand + +00:16:02.280 --> 00:16:04.959 +what changes in the function `adt-2`... + +00:16:04.960 --> 00:16:08.639 +how it is modified internally. + +00:16:08.640 --> 00:16:11.479 +I'm calling that the internal view of the function, + +00:16:11.480 --> 00:16:13.599 +and we are going to compare + +00:16:13.600 --> 00:16:16.679 +several internal views of the function `adt-2`. + +00:16:16.680 --> 00:16:19.999 +I'm going to reset the function `adt-2` + +00:16:20.000 --> 00:16:25.679 +by removing the advices and placing the advices on it again... + +00:16:25.680 --> 00:16:28.507 +and if we just pretty-print this function here, + +00:16:28.508 --> 00:16:36.319 +the symbol... the value of this symbol here as a function, + +00:16:36.320 --> 00:16:38.639 +it is something very ugly. + +00:16:38.640 --> 00:16:43.839 +But if we print it in another way, with `cl-prin1`, + +00:16:43.840 --> 00:16:47.239 +then we get something that is much nicer... + +00:16:47.240 --> 00:16:51.159 +but that is not indented. And if we use this thing here, + +00:16:51.160 --> 00:16:55.839 +`cl-prin2` instead of `cl-prin1`, it becomes indented. + +00:16:55.840 --> 00:17:00.839 +So let's try it again. + +00:17:00.840 --> 00:17:06.799 +Here is the current view of what is `adt-2`. + +00:17:06.800 --> 00:17:09.999 +So, the original `adt-insert` is here... + +00:17:10.000 --> 00:17:11.839 +and here are some modifications + +00:17:11.840 --> 00:17:13.519 +that were added by the advices. + +00:17:13.520 --> 00:17:16.759 +And we can run these things many times + +00:17:16.760 --> 00:17:19.239 +to understand what each step does. + +00:17:19.240 --> 00:17:21.239 +But my suggestion is: in the first time + +00:17:21.240 --> 00:17:23.879 +just run everything very quickly... + +00:17:23.880 --> 00:17:25.199 +and then you run it again, + +00:17:25.200 --> 00:17:29.119 +paying attention to the parts that look more interesting. + +NOTE Printing something in different ways for lambdas + +00:17:29.120 --> 00:17:37.373 +Now, I'm going to... Remember that here + +00:17:37.374 --> 00:17:42.559 +I printed the contents of `adt-2` in several different ways, + +00:17:42.560 --> 00:17:47.119 +and now I'm going to show how we can do the same idea + +00:17:47.120 --> 00:17:51.599 +of printing something in different ways for lambdas... + +00:17:51.600 --> 00:17:52.919 +that is something that I explained + +00:17:52.920 --> 00:17:54.639 +in the first part of the video. + +00:17:54.640 --> 00:18:00.639 +In this part of the demo we define a function `foo`... + +00:18:00.640 --> 00:18:06.360 +this `setq` here defines `o` as + +00:18:06.361 --> 00:18:08.959 +the contents of the function cell of `foo`... + +00:18:08.960 --> 00:18:12.999 +And now we are going to print + +00:18:13.000 --> 00:18:15.399 +that `o` in several different ways. + +00:18:15.400 --> 00:18:19.199 +The default way is this one, it's very ugly, + +00:18:19.200 --> 00:18:22.239 +but we can redefine how these things are printed + +00:18:22.240 --> 00:18:24.559 +by just running these lines... + +00:18:24.560 --> 00:18:28.719 +and if we pay attention at what's happening + +00:18:28.720 --> 00:18:30.519 +at the window at the right, + +00:18:30.520 --> 00:18:33.559 +we can see that we have several different + +00:18:33.560 --> 00:18:35.759 +printed representations for the same thing... + +00:18:35.760 --> 00:18:36.879 +and then at the last step, + +00:18:36.880 --> 00:18:41.079 +we reset the printer to the default representation. + +00:18:41.080 --> 00:18:43.279 +And the details are here. + +00:18:43.280 --> 00:18:44.999 +If we run these lines here, + +00:18:45.000 --> 00:18:48.759 +they show the definitions at the window at the right. + +00:18:48.760 --> 00:18:53.879 +And this... now comes the difficult part, + +00:18:53.880 --> 00:18:56.679 +in which we have to do something + +00:18:56.680 --> 00:19:02.079 +besides just running things with F8. We need + +00:19:02.080 --> 00:19:04.919 +a help buffer with buttons... + +00:19:04.920 --> 00:19:08.919 +buttons in the traditional sense, + +00:19:08.920 --> 00:19:11.559 +and we need to choose a certain button there, + +00:19:11.560 --> 00:19:13.439 +or any button there, + +00:19:13.440 --> 00:19:17.940 +and run `M-x ee-set-button` on that button. + +00:19:17.941 --> 00:19:24.719 +So, let me define a `struct` here, + +00:19:24.720 --> 00:19:29.359 +and this is some help on what is that structure. + +00:19:29.360 --> 00:19:33.599 +I'm going to choose this button here + +00:19:33.600 --> 00:19:40.159 +and I'm going to type `M-x ee-set-button`. + +00:19:40.160 --> 00:19:43.559 +The message is a bit obscure. + +00:19:43.560 --> 00:19:47.959 +And now we have something that displays + +00:19:47.960 --> 00:19:51.079 +a lot of information about that button... + +00:19:51.080 --> 00:19:53.919 +And we can also run that with just `F8`s. + +00:19:53.920 --> 00:20:00.279 +By the way, if we want to understand + +00:20:00.280 --> 00:20:02.319 +the code that's behind these things, + +00:20:02.320 --> 00:20:04.839 +we can run this sexp here. + +00:20:04.840 --> 00:20:07.959 +It is going to show the code here at the right. + +00:20:07.960 --> 00:20:10.759 +But anyway, these first lines here... + +00:20:10.760 --> 00:20:15.479 +they display the output in the echo area... Let's try... + +00:20:15.480 --> 00:20:20.559 +And each one of them extracts a different part + +00:20:20.560 --> 00:20:22.559 +of the information on that button. + +00:20:22.560 --> 00:20:26.039 +And these other lines here create a three-window setting + +00:20:26.040 --> 00:20:29.639 +in which the help buffer is shown here, + +00:20:29.640 --> 00:20:33.119 +and the result of some other thing + +00:20:33.120 --> 00:20:39.979 +is shown in the third window. Let's try... + +00:20:39.980 --> 00:20:41.164 +So now that we have... well... I said + +00:20:41.165 --> 00:20:48.407 +that we needed to choose a certain button + +00:20:48.408 --> 00:20:53.439 +and run `M-x ee-set-button` there. We have done that... + +00:20:53.440 --> 00:20:55.919 +so now this variable `ee-button` + +00:20:55.920 --> 00:20:58.439 +contains information about the button... + +00:20:58.440 --> 00:21:01.119 +And now we can run this part here + +00:21:01.120 --> 00:21:03.479 +as many times as we want to... + +00:21:03.480 --> 00:21:07.479 +try to understand what are the values of these things here... + +00:21:07.480 --> 00:21:11.679 +and how some things start with a value that is very complex + +00:21:11.680 --> 00:21:13.839 +and very difficult to understand, + +00:21:13.840 --> 00:21:16.839 +and then we extract the more interesting parts. + +00:21:16.840 --> 00:21:22.279 +And the details, as I said, are here. + +00:21:22.280 --> 00:21:26.759 +That was the end of the demo, and my question is, + +00:21:26.760 --> 00:21:28.559 +what was your reaction to that? + +00:21:28.560 --> 00:21:32.679 +If your reaction was more like "wow" than like "blergh" + +00:21:32.680 --> 00:21:37.039 +then you might like the last part of the video that I recorded in March, + +00:21:37.040 --> 00:21:38.399 +that was very technical... + +00:21:38.400 --> 00:21:42.719 +When I recorded it, I thought, oh my god, this video is very bad... + +00:21:42.720 --> 00:21:47.279 +only the hardcore eev users are going to like that, + +00:21:47.280 --> 00:21:51.039 +and there are less than five hardcore + +00:21:51.040 --> 00:21:52.839 +eev users in the world... + +NOTE Exploring buttons + +00:21:52.840 --> 00:21:56.639 +But anyway, if you saw that introduction + +00:21:56.640 --> 00:21:59.079 +and you think that these things are interesting, + +00:21:59.080 --> 00:22:02.999 +you can execute any one of these S-expressions here + +00:22:03.000 --> 00:22:05.999 +and take a look at the final part of that video + +00:22:06.000 --> 00:22:09.559 +that describes how I wrote some functions + +00:22:09.560 --> 00:22:14.239 +for exploring buttons. If you execute this sexp here, + +00:22:14.240 --> 00:22:19.559 +it plays a part of the video starting from that position. + +00:22:19.560 --> 00:22:26.919 +If you execute this one, you go to the subtitles in HTML... + +00:22:26.920 --> 00:22:30.559 +and if you run this one, you go + +00:22:30.560 --> 00:22:36.159 +to the subtitles in another format. And... that's it! + +00:22:36.160 --> 00:22:40.119 +No, no, sorry, I said "that's it", + +00:22:40.120 --> 00:22:42.159 +but I forgot a very important part... + +NOTE Some design decisions behind eev + +00:22:42.160 --> 00:22:45.159 +I had prepared this slide here + +00:22:45.160 --> 00:22:48.507 +to explain some design decisions behind eev + +00:22:48.508 --> 00:22:53.679 +and why there are so few users of eev... and let me do that. + +00:22:53.680 --> 00:22:57.919 +The thing is that my working memory is very small, + +00:22:57.920 --> 00:23:01.279 +and I need examples that are easy to visualize... + +00:23:01.280 --> 00:23:04.959 +ideally, examples that are easy to run + +00:23:04.960 --> 00:23:10.307 +and that I can compare the outputs + +00:23:10.308 --> 00:23:12.159 +of different ways of running them. + +00:23:12.160 --> 00:23:16.359 +For me, understanding specifications + +00:23:16.360 --> 00:23:20.679 +in an API is not enough... examples work much better for me. + +00:23:20.680 --> 00:23:24.439 +Also, I make lots of mistakes when I type... + +00:23:24.440 --> 00:23:28.399 +so I need ways to run my executable notes + +00:23:28.400 --> 00:23:31.879 +by just typing `f8` and `M-e`... + +00:23:31.880 --> 00:23:37.039 +and... most people in the #emacs channel and in other places + +00:23:37.040 --> 00:23:44.519 +recommend executing sexps by typing `M-:`, like this... + +00:23:44.520 --> 00:23:49.239 +But I hate that... I think that `M-:` and IELM are + +00:23:49.240 --> 00:23:54.559 +for people who type well, so not me... + +00:23:54.560 --> 00:23:58.839 +And also, 99% of what I do is scratch code. + +00:23:58.840 --> 00:24:01.639 +Very few things that I do go + +00:24:01.640 --> 00:24:05.799 +into "production" - between quotes. + +NOTE Tests + +00:24:05.800 --> 00:24:10.199 +So most of my tests are not automated tests. + +00:24:10.200 --> 00:24:12.439 +They are just things that I run with F8, + +00:24:12.440 --> 00:24:15.879 +and they don't include the expected result. + +00:24:15.880 --> 00:24:19.159 +Many people feel that this is very, very, very wrong. + +00:24:19.160 --> 00:24:23.279 +Tests MUST MEAN automated tests. + +00:24:23.280 --> 00:24:25.639 +Also, and this is very frustrating, + +00:24:25.640 --> 00:24:28.399 +eev has lots of "non-users", + +00:24:28.400 --> 00:24:31.519 +I mean, people who have tried to use it, + +00:24:31.520 --> 00:24:34.759 +but they said that they couldn't figure out how to use it. + +00:24:34.760 --> 00:24:36.159 +They couldn't understand + +00:24:36.160 --> 00:24:38.079 +what would be the workflows for eev. + +00:24:38.080 --> 00:24:43.679 +And that's the same that happens with me with code blocks in Org... + +00:24:43.680 --> 00:24:48.759 +I'm still at the point in which code blocks in Org just feel wrong. + +00:24:48.760 --> 00:24:55.199 +I still don't understand how to organize my workflows around code blocks. + +00:24:55.200 --> 00:24:58.999 +I said that eev has very few users, + +00:24:59.000 --> 00:25:02.239 +and they are all very weird and very busy, + +00:25:02.240 --> 00:25:06.359 +and I decided that all my blog-ish posts about eev + +00:25:06.360 --> 00:25:09.719 +would be things that they can run in a few minutes... + +00:25:09.720 --> 00:25:13.039 +just like the demo that I showed a few minutes ago. + +00:25:13.040 --> 00:25:16.119 +I said "like the examples in the rest of the video", + +00:25:16.120 --> 00:25:17.399 +but I forgot this slide, + +00:25:17.400 --> 00:25:19.639 +and I'm recording this after the demo. +00:25:19.640 --> 00:25:22.520 +So... that's it. Thanks! -- cgit v1.2.3