diff options
4 files changed, 1673 insertions, 486 deletions
diff --git a/2020/subtitles/emacsconf-2020--32-object-oriented-code-in-the-gnus-newsreader--eric-abrahamsen-autogen.vtt b/2020/subtitles/emacsconf-2020--32-object-oriented-code-in-the-gnus-newsreader--eric-abrahamsen-autogen.vtt index 9f4d0e06..55af2c4c 100644 --- a/2020/subtitles/emacsconf-2020--32-object-oriented-code-in-the-gnus-newsreader--eric-abrahamsen-autogen.vtt +++ b/2020/subtitles/emacsconf-2020--32-object-oriented-code-in-the-gnus-newsreader--eric-abrahamsen-autogen.vtt @@ -1,733 +1,682 @@ WEBVTT 00:00:01.839 --> 00:00:04.160 -hello EmacsConf +Hello, EmacsConf! -00:00:04.160 --> 00:00:05.759 -thanks very much first of all to the +00:00:04.160 --> 00:00:05.279 +Thanks very much, first of all, -00:00:05.759 --> 00:00:07.200 -organizers of the conference +00:00:05.280 --> 00:00:07.200 +to the organizers of the conference -00:00:07.200 --> 00:00:09.440 -and to the audience who I hope is out +00:00:07.200 --> 00:00:08.800 +and to the audience, -00:00:09.440 --> 00:00:10.480 -there somewhere +00:00:08.801 --> 00:00:10.480 +who I hope is out there somewhere, -00:00:10.480 --> 00:00:12.080 -uh for giving me this chance to talk +00:00:10.480 --> 00:00:11.679 +for giving me this chance -00:00:12.080 --> 00:00:14.240 -about Emacs and some of my uh +00:00:11.680 --> 00:00:12.880 +to talk about Emacs -00:00:14.240 --> 00:00:16.560 -my poking around with Emacs lisp my name +00:00:12.881 --> 00:00:16.240 +and some of my poking around with Emacs Lisp. -00:00:16.560 --> 00:00:18.480 -is eric abrahamson I'm not +00:00:16.241 --> 00:00:17.680 +My name is Eric Abrahamsen. -00:00:18.480 --> 00:00:20.960 -a professional programmer but I use +00:00:17.681 --> 00:00:20.480 +I'm not a professional programmer, -00:00:20.960 --> 00:00:21.920 -Emacs all day +00:00:20.481 --> 00:00:23.039 +but I use Emacs all day, every day, -00:00:21.920 --> 00:00:24.800 -every day for writing for translating +00:00:23.040 --> 00:00:24.800 +for writing, for translating, 00:00:24.800 --> 00:00:26.160 -for project management +for project management, -00:00:26.160 --> 00:00:28.160 -and most importantly for email which +00:00:26.160 --> 00:00:27.920 +and most importantly, for email, -00:00:28.160 --> 00:00:29.199 -will be the +00:00:27.921 --> 00:00:30.640 +which will be the subject of my talk today. -00:00:29.199 --> 00:00:32.480 -subject of my talk today so I'm talking +00:00:30.641 --> 00:00:32.880 +So I'm talking about -00:00:32.480 --> 00:00:35.440 -about object-oriented code in Emacs +00:00:32.881 --> 00:00:34.160 +object-oriented code -00:00:35.440 --> 00:00:38.320 -uh most famous possibly oldest +00:00:34.161 --> 00:00:38.320 +in Emacs' most famous, possibly oldest, -00:00:38.320 --> 00:00:40.160 -definitely most notorious news reader +00:00:38.320 --> 00:00:39.520 +definitely most notorious -00:00:40.160 --> 00:00:41.760 -slash Emacs client +00:00:39.521 --> 00:00:42.800 +news reader / email client, -00:00:41.760 --> 00:00:44.320 -email client so in particular object +00:00:42.801 --> 00:00:44.000 +so, in particular, -00:00:44.320 --> 00:00:45.440 -oriented code +00:00:44.001 --> 00:00:46.000 +object-oriented code in Gnus. -00:00:45.440 --> 00:00:50.239 -in news why object-oriented code +00:00:46.001 --> 00:00:50.239 +Why object-oriented code? -00:00:50.239 --> 00:00:51.920 -the way news works is it started off as +00:00:50.239 --> 00:00:51.199 +The way Gnus works is -00:00:51.920 --> 00:00:53.600 -a news reader so for access +00:00:51.200 --> 00:00:52.480 +it started off as a news reader, -00:00:53.600 --> 00:00:57.039 -accessing nntp servers and later on grew +00:00:52.481 --> 00:00:55.920 +so for accessing NNTP servers -00:00:57.039 --> 00:00:59.120 -a whole bunch of new functionality as a +00:00:55.921 --> 00:00:57.600 +and later on grew a whole bunch -00:00:59.120 --> 00:01:01.039 -mail client so it can talk to imap +00:00:57.601 --> 00:00:59.760 +of new functionality as a mail client, -00:01:01.039 --> 00:01:02.079 -servers +00:00:59.761 --> 00:01:02.079 +so it can talk to IMAP servers, -00:01:02.079 --> 00:01:04.799 -mail dealer directories uh folders on +00:01:02.079 --> 00:01:04.320 +Maildir directories, -00:01:04.799 --> 00:01:06.640 -your file system all kinds of stuff +00:01:04.321 --> 00:01:05.360 +folders on your file system, -00:01:06.640 --> 00:01:08.400 -but it presents a unified interface to +00:01:05.361 --> 00:01:06.640 +all kinds of stuff, -00:01:08.400 --> 00:01:09.760 -all those things so it's basically +00:01:06.640 --> 00:01:08.320 +but it presents a unified interface -00:01:09.760 --> 00:01:11.040 -polymorphism +00:01:08.321 --> 00:01:08.960 +to all those things, -00:01:11.040 --> 00:01:14.000 -one of the the basic fundamental +00:01:08.961 --> 00:01:11.040 +so it's basically polymorphism, -00:01:14.000 --> 00:01:16.400 -principles of object oriented code so +00:01:11.040 --> 00:01:14.560 +one of the the basic fundamental principles -00:01:16.400 --> 00:01:18.720 -it's a good fit second reason is it +00:01:14.561 --> 00:01:15.680 +of object oriented code. -00:01:18.720 --> 00:01:19.920 -already is +00:01:15.681 --> 00:01:17.600 +So it's a good fit. -00:01:19.920 --> 00:01:22.880 -object oriented and I'll get into what +00:01:17.601 --> 00:01:21.439 +Second reason is it already is object-oriented, -00:01:22.880 --> 00:01:23.759 -that means +00:01:21.440 --> 00:01:25.280 +and I'll get into what that means in a second. -00:01:23.759 --> 00:01:27.280 -in a second so +00:01:25.281 --> 00:01:28.479 +So the background that you should know -00:01:27.280 --> 00:01:28.640 -the background that you should know is +00:01:28.480 --> 00:01:30.000 +is that most of this code -00:01:28.640 --> 00:01:30.640 -that most of this code was written in - -00:01:30.640 --> 00:01:32.560 -the 90s +00:01:30.001 --> 00:01:32.560 +was written in the 90s. 00:01:32.560 --> 00:01:34.880 -Emacs lisp has only grown sort of - -00:01:34.880 --> 00:01:36.159 -official +Emacs Lisp has only grown sort of -00:01:36.159 --> 00:01:38.640 -object orientation support libraries +00:01:34.881 --> 00:01:38.640 +official object orientation support libraries 00:01:38.640 --> 00:01:41.200 -over the past 10 years or so - -00:01:41.200 --> 00:01:43.840 -from about 2010 to the present so what - -00:01:43.840 --> 00:01:44.799 -does - -00:01:44.799 --> 00:01:48.640 -news do so the basics of +over the past 10 years or so, -00:01:48.640 --> 00:01:50.560 -object orientation in most languages are +00:01:41.200 --> 00:01:42.799 +from about 2010 to the present. -00:01:50.560 --> 00:01:52.240 -you you define +00:01:42.800 --> 00:01:45.920 +So what does Gnus do? -00:01:52.240 --> 00:01:53.759 -a class of some sort and then you +00:01:45.921 --> 00:01:49.520 +So the basics of object orientation -00:01:53.759 --> 00:01:55.840 -instantiate that class and these +00:01:49.521 --> 00:01:50.560 +in most languages are: -00:01:55.840 --> 00:01:58.079 -class instances have two things they +00:01:50.560 --> 00:01:53.439 +you define a class of some sort, -00:01:58.079 --> 00:02:00.320 -have data attributes or +00:01:53.440 --> 00:01:55.040 +and then you instantiate that class. -00:02:00.320 --> 00:02:01.759 -slots or members or whatever you're +00:01:55.041 --> 00:01:57.920 +These class instances have two things: -00:02:01.759 --> 00:02:04.799 -going to call them and they have +00:01:57.921 --> 00:02:00.719 +they have data attributes (or slots, -00:02:04.799 --> 00:02:07.280 -methods which operate on individual +00:02:00.720 --> 00:02:01.680 +or members, or whatever -00:02:07.280 --> 00:02:08.399 -instances +00:02:01.681 --> 00:02:02.640 +you're going to call them), -00:02:08.399 --> 00:02:11.120 -so you could say that you create or +00:02:02.641 --> 00:02:05.600 +and they have methods -00:02:11.120 --> 00:02:12.879 -instantiate an instance of a class in +00:02:05.601 --> 00:02:08.399 +which operate on individual instances. -00:02:12.879 --> 00:02:13.920 -that instance +00:02:08.399 --> 00:02:10.239 +So you could say that -00:02:13.920 --> 00:02:16.239 -owns two things that owns its set of +00:02:10.240 --> 00:02:11.840 +you create or instantiate -00:02:16.239 --> 00:02:17.120 -attributes +00:02:11.841 --> 00:02:12.800 +an instance of a class, -00:02:17.120 --> 00:02:20.239 -and it owns some methods which +00:02:12.801 --> 00:02:14.800 +and that instance owns two things. -00:02:20.239 --> 00:02:23.280 -also work on the on the instance +00:02:14.801 --> 00:02:17.120 +That owns its set of attributes, -00:02:23.280 --> 00:02:26.720 -so both in nurse's existing code and in +00:02:17.120 --> 00:02:19.520 +and it owns some methods, -00:02:26.720 --> 00:02:29.040 -the more standard object oriented Emacs +00:02:19.521 --> 00:02:23.280 +which also work on the instance. -00:02:29.040 --> 00:02:30.080 -lisp libraries +00:02:23.280 --> 00:02:25.680 +Both in Gnus' existing code -00:02:30.080 --> 00:02:32.480 -this relationship is turned on its head +00:02:25.681 --> 00:02:28.560 +and in the more standard object-oriented -00:02:32.480 --> 00:02:34.080 -a little bit +00:02:28.561 --> 00:02:31.680 +Emacs Lisp libraries, this relationship -00:02:34.080 --> 00:02:37.599 -in that data slots and +00:02:31.681 --> 00:02:34.080 +is turned on its head a little bit, -00:02:37.599 --> 00:02:40.239 -uh and instance methods are defined +00:02:34.080 --> 00:02:39.599 +in that data slots and instance methods -00:02:40.239 --> 00:02:41.360 -outside of the +00:02:39.600 --> 00:02:41.760 +are defined outside of the class -00:02:41.360 --> 00:02:42.959 -class or the instances themselves so +00:02:41.761 --> 00:02:42.959 +or the instances themselves. 00:02:42.959 --> 00:02:45.040 -they are top level definitions +They are top-level definitions. 00:02:45.040 --> 00:02:46.879 -so we'll get to what that means in the +We'll get to what that means -00:02:46.879 --> 00:02:48.319 -in the newer libraries um +00:02:46.879 --> 00:02:48.720 +in the newer libraries in a bit, -00:02:48.319 --> 00:02:49.840 -in a bit but uh first I want to talk +00:02:48.721 --> 00:02:49.920 +but first I want to talk about -00:02:49.840 --> 00:02:51.760 -about how news does this and in order to +00:02:49.921 --> 00:02:51.280 +how Gnus does this. -00:02:51.760 --> 00:02:54.319 -do that we are going to go deep into +00:02:51.281 --> 00:02:52.160 +In order to do that, -00:02:54.319 --> 00:02:57.440 -the darkest corner of the new co source +00:02:52.161 --> 00:02:54.319 +we are going to go deep into -00:02:57.440 --> 00:02:59.879 -code tree to a library called +00:02:54.319 --> 00:02:55.760 +the darkest corner -00:02:59.879 --> 00:03:02.879 -nno.l very cryptically +00:02:55.761 --> 00:02:58.080 +of the Gnus source code tree -00:03:02.879 --> 00:03:05.040 -titled uh library and when we open it up +00:02:58.081 --> 00:03:01.440 +to a library called nnoo.el, -00:03:05.040 --> 00:03:06.800 -we find +00:03:01.441 --> 00:03:04.080 +very cryptically-titled library, -00:03:06.800 --> 00:03:09.519 -a library with no code comments and +00:03:04.081 --> 00:03:06.800 +and when we open it up, we find -00:03:09.519 --> 00:03:11.040 -almost no doc strings +00:03:06.800 --> 00:03:09.280 +a library with no code comments + +00:03:09.281 --> 00:03:11.040 +and almost no doc strings. 00:03:11.040 --> 00:03:12.800 -almost as if lars was a little ashamed +Almost as if Lars was a little ashamed-- 00:03:12.800 --> 00:03:14.159 -not ashamed but knew he was doing +not ashamed, but knew he was doing 00:03:14.159 --> 00:03:16.000 something a little bit crazy -00:03:16.000 --> 00:03:19.040 -and didn't want anyone to see so +00:03:16.000 --> 00:03:18.080 +and didn't want anyone to see. -00:03:19.040 --> 00:03:21.040 -this file contains the the object +00:03:18.081 --> 00:03:20.560 +So this file contains -00:03:21.040 --> 00:03:22.400 -oriented mechanism +00:03:20.561 --> 00:03:22.400 +the object-oriented mechanism -00:03:22.400 --> 00:03:24.480 -whereby you can define different kinds +00:03:22.400 --> 00:03:23.920 +whereby you can define -00:03:24.480 --> 00:03:25.760 -of back ends for news +00:03:23.921 --> 00:03:25.760 +different kinds of backends for Gnus, -00:03:25.760 --> 00:03:27.280 -and then those back ends can be +00:03:25.760 --> 00:03:26.799 +and then those backends -00:03:27.280 --> 00:03:29.760 -instantiated as individual +00:03:26.800 --> 00:03:30.879 +can be instantiated as individual servers. -00:03:29.760 --> 00:03:32.480 -servers and as you define these backends +00:03:30.880 --> 00:03:32.480 +As you define these backends, -00:03:32.480 --> 00:03:33.360 -you're supposed to use +00:03:32.480 --> 00:03:34.319 +you're supposed to use two macros, -00:03:33.360 --> 00:03:36.000 -two macros which you can see here one is +00:03:34.320 --> 00:03:35.680 +which you can see here. -00:03:36.000 --> 00:03:36.640 -called def +00:03:35.681 --> 00:03:37.280 +One is called defvoo, -00:03:36.640 --> 00:03:39.599 -vu and one is called defu and if you +00:03:37.281 --> 00:03:39.440 +and one is called deffoo. -00:03:39.599 --> 00:03:41.280 -look at the definitions the definitions +00:03:39.441 --> 00:03:40.400 +If you look at the definitions, -00:03:41.280 --> 00:03:43.280 -look pretty simple here def vu basically +00:03:40.401 --> 00:03:41.920 +the definitions look pretty simple. -00:03:43.280 --> 00:03:45.440 -turns into a def var +00:03:41.921 --> 00:03:45.440 +Here, defvoo basically turns into a defvar 00:03:45.440 --> 00:03:49.040 -and foo turns into a defund +and foo turns into a defun. 00:03:49.040 --> 00:03:52.239 -and along with those basic definitions +Along with those basic definitions, 00:03:52.239 --> 00:03:55.760 -the library also does some registration +the library also does some registration, 00:03:55.760 --> 00:03:58.720 -memoization caching of those variables - -00:03:58.720 --> 00:04:00.080 -it saves them in the structure - -00:04:00.080 --> 00:04:01.840 -for later use so that we know that those - -00:04:01.840 --> 00:04:03.360 -are meant to be - -00:04:03.360 --> 00:04:05.280 -uh attributes and methods that are used +memoization, caching of those variables. -00:04:05.280 --> 00:04:06.640 -with instances +00:03:58.720 --> 00:04:00.879 +It saves them in the structure for later use, -00:04:06.640 --> 00:04:08.000 -with server instances but you can see +00:04:00.880 --> 00:04:03.360 +so that we know that those are meant to be -00:04:08.000 --> 00:04:09.280 -that there's no server instance +00:04:03.360 --> 00:04:04.799 +attributes and methods -00:04:09.280 --> 00:04:10.560 -definition here there's no +00:04:04.800 --> 00:04:06.640 +that are used with instances, -00:04:10.560 --> 00:04:13.200 -like no nothing these are top level +00:04:06.640 --> 00:04:07.519 +with server instances. -00:04:13.200 --> 00:04:14.239 -these are top level +00:04:07.520 --> 00:04:08.159 +But you can see that -00:04:14.239 --> 00:04:18.160 -definitions so really data attributes +00:04:08.160 --> 00:04:10.000 +there's no server instance definition here. -00:04:18.160 --> 00:04:18.639 -for +00:04:10.001 --> 00:04:12.159 +There's no, like, no nothing. -00:04:18.639 --> 00:04:22.000 -new servers and +00:04:12.160 --> 00:04:14.799 +These are top-level definitions, -00:04:22.000 --> 00:04:23.840 -methods or functions that operate on +00:04:14.800 --> 00:04:20.239 +so really, data attributes for new servers -00:04:23.840 --> 00:04:25.440 -those instances are completely +00:04:20.240 --> 00:04:23.040 +and methods or functions -00:04:25.440 --> 00:04:28.400 -separate mechanisms they don't really +00:04:23.041 --> 00:04:24.639 +that operate on those instances -00:04:28.400 --> 00:04:29.600 -have anything to do with each other they +00:04:24.640 --> 00:04:27.840 +are completely separate mechanisms. -00:04:29.600 --> 00:04:31.680 -don't belong to the same data structures +00:04:27.841 --> 00:04:29.040 +They don't really have anything to do -00:04:31.680 --> 00:04:37.120 -so how do they work follow me +00:04:29.041 --> 00:04:29.520 +with each other. -00:04:37.120 --> 00:04:39.520 -aka methods and attributes these are all +00:04:29.521 --> 00:04:31.680 +They don't belong to the same data structures. -00:04:39.520 --> 00:04:41.360 -the things I just said +00:04:31.680 --> 00:04:34.080 +So how do they work? -00:04:41.360 --> 00:04:44.479 -so when you define a +00:04:34.081 --> 00:04:37.120 +Follow me. deffoo and defvoo, -00:04:44.479 --> 00:04:48.560 -a backend type +00:04:37.120 --> 00:04:38.960 +aka methods and attributes, -00:04:48.560 --> 00:04:51.199 -in noose what you get is this a +00:04:38.961 --> 00:04:41.360 +these are all the things I just said. -00:04:51.199 --> 00:04:52.400 -definition a list +00:04:41.360 --> 00:04:50.240 +So when you define a a backend type in Gnus, -00:04:52.400 --> 00:04:54.080 -and it'll say there is such a back end +00:04:50.241 --> 00:04:52.400 +what you get is this: a definition, a list. -00:04:54.080 --> 00:04:55.520 -as nnml +00:04:52.400 --> 00:04:55.520 +It'll say, there is such a backend as nnml, 00:04:55.520 --> 00:04:58.880 -and these are its uh data attributes +and these are its data attributes -00:04:58.880 --> 00:04:59.520 -that any +00:04:58.880 --> 00:05:01.039 +that any given instance can have, -00:04:59.520 --> 00:05:01.840 -given instance can have and then these +00:05:01.040 --> 00:05:04.720 +and then these are the functions or methods -00:05:01.840 --> 00:05:02.960 -are +00:05:04.721 --> 00:05:06.880 +that are defined to operate on -00:05:02.960 --> 00:05:04.960 -the functions or methods that are +00:05:06.880 --> 00:05:08.240 +an instance of this backend, -00:05:04.960 --> 00:05:06.880 -defined to operate on +00:05:08.241 --> 00:05:09.600 +so a server that belongs to -00:05:06.880 --> 00:05:08.960 -an instance of this backend so a server +00:05:09.601 --> 00:05:12.160 +the nnml backend. -00:05:08.960 --> 00:05:11.440 -that belongs to the nnml +00:05:12.161 --> 00:05:13.600 +So at least we have this data here. -00:05:11.440 --> 00:05:13.360 -backend so at least we have this data +00:05:13.601 --> 00:05:16.080 +That's handy. We don't really touch that. -00:05:13.360 --> 00:05:15.120 -here so that's that's handy we don't you +00:05:16.081 --> 00:05:19.600 +That's, like, very, very, very deep Gnus code -00:05:15.120 --> 00:05:16.880 -don't really touch that that's like very +00:05:19.601 --> 00:05:20.560 +that doesn't really come up -00:05:16.880 --> 00:05:18.000 -very very deep +00:05:20.560 --> 00:05:25.199 +even as a bug squasher or whatever. -00:05:18.000 --> 00:05:20.560 -um use code that doesn't really come up +00:05:25.200 --> 00:05:26.160 +We don't touch that very often, -00:05:20.560 --> 00:05:22.560 -even as a +00:05:26.161 --> 00:05:26.800 +but there they are, -00:05:22.560 --> 00:05:25.280 -even as a bug squasher or whatever we +00:05:26.801 --> 00:05:29.199 +and that's how they work. -00:05:25.280 --> 00:05:26.479 -don't touch that very often but there +00:05:29.200 --> 00:05:31.039 +Now the next thing that obviously -00:05:26.479 --> 00:05:27.280 -they are and that's +00:05:31.040 --> 00:05:32.080 +you want to know is, okay, -00:05:27.280 --> 00:05:30.400 -that's how they work now the next thing +00:05:32.080 --> 00:05:33.759 +where are... if I've started up Gnus, -00:05:30.400 --> 00:05:32.080 -that obviously you want to know is okay +00:05:33.760 --> 00:05:35.039 +where are my servers? -00:05:32.080 --> 00:05:34.000 -where are if I've started up news where +00:05:35.039 --> 00:05:36.880 +Where are these server objects, -00:05:34.000 --> 00:05:35.039 -are my servers +00:05:36.881 --> 00:05:40.479 +since this is object-oriented programming? -00:05:35.039 --> 00:05:37.199 -uh where are these server objects since +00:05:40.480 --> 00:05:41.520 +And the weird thing -00:05:37.199 --> 00:05:39.199 -this is object oriented +00:05:41.521 --> 00:05:43.759 +that you will eventually figure out -00:05:39.199 --> 00:05:41.840 -programming and the weird thing that you +00:05:43.760 --> 00:05:45.680 +(in some cases, after years of poking around) -00:05:41.840 --> 00:05:43.199 -will eventually +00:05:45.681 --> 00:05:46.880 +in the Gnus source code -00:05:43.199 --> 00:05:45.199 -figure out in some cases after years of +00:05:46.880 --> 00:05:48.880 +is that servers do not exist -00:05:45.199 --> 00:05:46.880 -poking around in the new source code +00:05:48.881 --> 00:05:51.360 +in an ontological, philosophical sense, -00:05:46.880 --> 00:05:49.199 -is that servers do not exist in an +00:05:51.361 --> 00:05:55.280 +as objects. The primary data structures of Gnus -00:05:49.199 --> 00:05:50.320 -ontological +00:05:55.281 --> 00:05:58.160 +are groups, and in sort of -00:05:50.320 --> 00:05:53.440 -philosophical sense as objects the +00:05:58.161 --> 00:06:00.560 +an object-oriented hierarchical mindset, -00:05:53.440 --> 00:05:55.440 -primary data structures of noose are +00:06:00.561 --> 00:06:03.039 +you'd think, well, groups belong to servers, -00:05:55.440 --> 00:05:57.039 -groups +00:06:03.040 --> 00:06:05.759 +so servers must exist, but they don't. -00:05:57.039 --> 00:05:58.960 -and in sort of an object-oriented +00:06:05.759 --> 00:06:07.840 +Each group... And here you can see -00:05:58.960 --> 00:06:00.720 -hierarchical you know mindset you'd - -00:06:00.720 --> 00:06:01.759 -think well - -00:06:01.759 --> 00:06:03.759 -groups belong to servers so servers must - -00:06:03.759 --> 00:06:05.759 -exist but they don't - -00:06:05.759 --> 00:06:08.000 -each group and here you can see some - -00:06:08.000 --> 00:06:09.360 -examples of groups +00:06:07.841 --> 00:06:09.360 +some examples of groups... 00:06:09.360 --> 00:06:11.199 -these are basically the data structures +These are basically the data structures -00:06:11.199 --> 00:06:13.039 -that represent a group each group also +00:06:11.199 --> 00:06:12.240 +that represent a group. -00:06:13.039 --> 00:06:14.960 -has a little entry here that +00:06:12.241 --> 00:06:14.160 +Each group also has a little entry here -00:06:14.960 --> 00:06:17.039 -that tells you what server it belongs to +00:06:14.161 --> 00:06:17.039 +that tells you what server it belongs to, -00:06:17.039 --> 00:06:18.000 -and each group +00:06:17.039 --> 00:06:20.080 +and each group replicates that data, -00:06:18.000 --> 00:06:20.479 -replicates that data uh saying which +00:06:20.081 --> 00:06:21.600 +saying which server it belongs to. -00:06:20.479 --> 00:06:23.120 -server it belongs to and so when +00:06:21.601 --> 00:06:24.000 +So when Gnus is going through -00:06:23.120 --> 00:06:24.479 -nurse is going through doing its +00:06:24.001 --> 00:06:25.280 +doing its business, -00:06:24.479 --> 00:06:26.160 -business uh trying to figure out what's +00:06:25.281 --> 00:06:27.039 +trying to figure out updating mail -00:06:26.160 --> 00:06:27.680 -like updating mail from the groups or +00:06:27.040 --> 00:06:28.479 +from the groups or whatever, -00:06:27.680 --> 00:06:29.840 -whatever almost every time +00:06:28.480 --> 00:06:30.960 +almost every time, it will cycle through -00:06:29.840 --> 00:06:31.600 -it will cycle through all the list of - -00:06:31.600 --> 00:06:32.960 -groups it'll +00:06:30.961 --> 00:06:32.960 +all the list of groups. 00:06:32.960 --> 00:06:34.960 -it'll look at all the server definitions - -00:06:34.960 --> 00:06:36.720 -and it will categorize the groups by +It'll look at all the server definitions, -00:06:36.720 --> 00:06:38.160 -server +00:06:34.960 --> 00:06:38.160 +and it will categorize the groups by server, -00:06:38.160 --> 00:06:41.120 -which which is just weird because you're +00:06:38.160 --> 00:06:40.000 +which is just weird, -00:06:41.120 --> 00:06:42.160 -sort of looking for okay where does the +00:06:40.001 --> 00:06:41.680 +because you're sort of looking for... -00:06:42.160 --> 00:06:43.840 -server exist it doesn't exist it's put +00:06:41.681 --> 00:06:42.720 +okay, where does the server exist? -00:06:43.840 --> 00:06:44.479 -together +00:06:42.721 --> 00:06:43.440 +It doesn't exist. -00:06:44.479 --> 00:06:48.319 -every time uh out of out of code +00:06:43.441 --> 00:06:46.240 +It's put together every time -00:06:48.319 --> 00:06:50.400 -elsewhere in the news code base +00:06:46.241 --> 00:06:50.400 +out of code elsewhere in the Gnus code base, -00:06:50.400 --> 00:06:51.840 -specifically from these group +00:06:50.400 --> 00:06:53.599 +specifically from these group definitions. -00:06:51.840 --> 00:06:54.080 -these group definitions and so this is +00:06:53.600 --> 00:06:54.479 +So this is very odd, -00:06:54.080 --> 00:06:55.199 -very odd because +00:06:54.480 --> 00:06:56.319 +because in some sense... -00:06:55.199 --> 00:06:58.080 -in in some sense like here this one its +00:06:56.320 --> 00:06:59.360 +Like here, this one, its server is nnml -00:06:58.080 --> 00:06:58.720 -server is +00:06:59.361 --> 00:07:01.680 +and an empty string, -00:06:58.720 --> 00:07:02.240 -nnml and an empty string so there's a +00:07:01.681 --> 00:07:02.880 +so there's a certain sense here -00:07:02.240 --> 00:07:03.919 -certain sense here in which this server +00:07:02.881 --> 00:07:04.720 +in which this server is not really -00:07:03.919 --> 00:07:04.479 -is not +00:07:04.721 --> 00:07:06.160 +an object at all. What it is -00:07:04.479 --> 00:07:06.400 -really an object at all what it is is a +00:07:06.161 --> 00:07:07.120 +is a set of instructions -00:07:06.400 --> 00:07:07.759 -set of instructions for how to find +00:07:07.121 --> 00:07:08.560 +for how to find messages, -00:07:07.759 --> 00:07:08.560 -messages +00:07:08.560 --> 00:07:10.319 +and this set of instructions is: -00:07:08.560 --> 00:07:11.199 -and this set of instructions is go to +00:07:10.320 --> 00:07:12.000 +go to the default place -00:07:11.199 --> 00:07:12.800 -the default place where the user +00:07:12.001 --> 00:07:14.000 +where the user might have their mail -00:07:12.800 --> 00:07:15.440 -might have their mail and expect to find +00:07:14.001 --> 00:07:16.319 +and expect to find messages there -00:07:15.440 --> 00:07:16.000 -messages +00:07:16.320 --> 00:07:18.479 +in an nnml format, which is basically -00:07:16.000 --> 00:07:18.080 -there in an nml format which is +00:07:18.480 --> 00:07:21.759 +just one message per file. -00:07:18.080 --> 00:07:19.840 -basically just one message per +00:07:21.760 --> 00:07:22.720 +Any number of groups could have -00:07:19.840 --> 00:07:22.479 -um per file and any number of groups +00:07:22.721 --> 00:07:24.400 +those same instructions, but they're not... -00:07:22.479 --> 00:07:23.840 -could have those same instructions uh - -00:07:23.840 --> 00:07:25.440 -but they're not it's not really a thing +00:07:24.401 --> 00:07:25.440 +It's not really a thing. 00:07:25.440 --> 00:07:26.720 -it's really just a +It's really just a... 00:07:26.720 --> 00:07:28.639 -it's more of a procedural instruction - -00:07:28.639 --> 00:07:30.240 -and on the other end of the spectrum you +It's more of a procedural instruction. -00:07:30.240 --> 00:07:31.919 -might have an nni map +00:07:28.639 --> 00:07:30.160 +On the other end of the spectrum, -00:07:31.919 --> 00:07:33.599 -server which very much is a thing it has +00:07:30.161 --> 00:07:32.240 +you might have an nnimap server, -00:07:33.599 --> 00:07:35.840 -its own it has its own server its own +00:07:32.241 --> 00:07:33.280 +which very much is a thing. -00:07:35.840 --> 00:07:37.759 -port its own authentication +00:07:33.281 --> 00:07:36.160 +It has its own server, its own port, -00:07:37.759 --> 00:07:40.240 -system so some of the servers are more +00:07:36.161 --> 00:07:38.960 +its own authentication system. -00:07:40.240 --> 00:07:41.360 -like things some of the servers are more +00:07:38.961 --> 00:07:40.639 +So some of the servers are more like things, -00:07:41.360 --> 00:07:42.400 -like instructions +00:07:40.640 --> 00:07:42.400 +some of the servers are more like instructions. 00:07:42.400 --> 00:07:45.520 -as news works right now um these +As Gnus works right now, 00:07:45.520 --> 00:07:47.280 most of the servers are treated like 00:07:47.280 --> 00:07:48.879 -just instruction sets +just instruction sets, 00:07:48.879 --> 00:07:50.879 -and and there's no place where you can +and there's no place where you can -00:07:50.879 --> 00:07:53.120 -go and find them there's no one central +00:07:50.880 --> 00:07:51.840 +go and find them. -00:07:53.120 --> 00:07:55.360 -uh variable that defines them all so how +00:07:51.841 --> 00:07:53.680 +There's no one central variable -00:07:55.360 --> 00:07:56.160 -do the +00:07:53.681 --> 00:07:56.160 +that defines them all. So how do the... -00:07:56.160 --> 00:07:57.520 -um so we'll talk about the methods in a +00:07:56.160 --> 00:07:57.759 +We'll talk about the methods in a second. -00:07:57.520 --> 00:07:59.520 -second how do the data attributes work +00:07:57.760 --> 00:07:59.520 +How do the data attributes work? 00:07:59.520 --> 00:08:02.639 -uh put very crudely um +Put very crudely, 00:08:02.639 --> 00:08:04.479 -your servers when they're put together +your servers, when they're put together, -00:08:04.479 --> 00:08:05.919 -uh they are okay they are +00:08:04.479 --> 00:08:06.879 +they are kept in a variable, -00:08:05.919 --> 00:08:08.080 -kept in a variable and it's called nno +00:08:06.880 --> 00:08:08.080 +and it's called nnoo 00:08:08.080 --> 00:08:08.960 nno diff --git a/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt b/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt new file mode 100644 index 00000000..7f4b8d30 --- /dev/null +++ b/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt @@ -0,0 +1,1244 @@ +00:00:01.040 --> 00:00:04.367 +Welcome, everyone, to this Emacs Conf 2021. + +00:00:04.467 --> 00:00:07.617 +My name is Fermin. I work as + +00:00:07.617 --> 00:00:09.717 +a Common Lisp engineer at RavenPack, + +00:00:09.817 --> 00:00:11.733 +and today I'm going to talk about + +00:00:11.833 --> 00:00:15.783 +CLEDE: the Common Lisp Emacs Development Environment. + +00:00:15.883 --> 00:00:19.400 +So what is CLEDE? + +00:00:19.500 --> 00:00:20.500 +So CLEDE is a project + +00:00:20.500 --> 00:00:22.017 +I've been working on this year + +00:00:22.117 --> 00:00:24.650 +for better... well, yeah... + +00:00:24.750 --> 00:00:27.117 +a better Common Lisp integration + +00:00:27.217 --> 00:00:30.317 +for static tools and + +00:00:30.417 --> 00:00:33.250 +for static and integrated Emacs tools. + +00:00:33.350 --> 00:00:35.367 +And to understand better what + +00:00:35.467 --> 00:00:37.650 +CLEDE is, one first has to understand + +00:00:37.750 --> 00:00:40.133 +the base that I use... + +00:00:40.233 --> 00:00:43.767 +so the foundation that I use for CLEDE. + +00:00:43.867 --> 00:00:46.050 +Um, so it is CEDET-- + +00:00:46.150 --> 00:00:47.417 +and specifically Semantic-- + +00:00:47.517 --> 00:00:49.733 +so we first have to talk about and + +00:00:49.833 --> 00:00:50.417 +understand what it is. + +00:00:50.517 --> 00:00:53.817 +So CEDET is a collection + +00:00:53.917 --> 00:00:55.183 +of Emacs development environment tools. + +00:00:55.283 --> 00:00:57.233 +It was created by Eric Ludlam + +00:00:57.333 --> 00:01:00.767 +(I hope to say that name right) + +00:01:00.867 --> 00:01:02.333 +in the late 90s, and + +00:01:02.433 --> 00:01:04.833 +the idea was to create entire IDE for Emacs. + +00:01:04.933 --> 00:01:10.433 +CEDET is still integrated into Emacs, + +00:01:10.533 --> 00:01:11.717 +and it has a lot of interesting things + +00:01:11.817 --> 00:01:14.033 +that are not used for too many people, + +00:01:14.133 --> 00:01:16.167 +so I'm going to explain some of those. + +00:01:16.267 --> 00:01:18.417 +First, let's go with the good ones that + +00:01:18.517 --> 00:01:21.233 +one that I use for CLEDE and that can + +00:01:21.333 --> 00:01:23.167 +be used for other projects as well. + +00:01:23.267 --> 00:01:28.450 +Some of the features that + +00:01:28.550 --> 00:01:32.450 +CEDET has is parse generators + +00:01:32.550 --> 00:01:35.217 +so we have Wisent and Bovine. + +00:01:35.317 --> 00:01:38.350 +Wisent is basically a Bison clone + +00:01:38.450 --> 00:01:40.200 +that was written in Emacs Lisp + +00:01:40.300 --> 00:01:43.117 +that you can also specify grammars. + +00:01:43.217 --> 00:01:45.617 +It's a really big and rather complex + +00:01:45.717 --> 00:01:47.350 +tool to work with, + +00:01:47.450 --> 00:01:49.183 +and it's secretly used for, as far as + +00:01:49.283 --> 00:01:51.667 +I know, two languages. + +00:01:51.767 --> 00:01:53.317 +They're not also well supported, + +00:01:53.417 --> 00:01:55.317 +but we'll get into that later. + +00:01:55.417 --> 00:01:58.133 +Also Bovine, which is a way more + +00:01:58.233 --> 00:01:59.867 +simple tool, like you can... + +00:01:59.967 --> 00:02:01.733 +you don't need grammar files, + +00:02:01.833 --> 00:02:07.350 +you can write just in plain Emacs Lisp. + +00:02:07.450 --> 00:02:10.917 +And you also have utilities to work with + +00:02:11.017 --> 00:02:16.550 +those generated tag trees, so to say. + +00:02:16.650 --> 00:02:23.533 +These are not AST parsers like real Bison; + +00:02:23.633 --> 00:02:25.617 +they are tag-based so they basically get + +00:02:25.717 --> 00:02:27.533 +tags and extract information from them, + +00:02:27.633 --> 00:02:30.083 +and I can use that information + +00:02:30.183 --> 00:02:31.000 +with Emacs Lisp + +00:02:31.000 --> 00:02:33.567 +to contextually understand better + +00:02:33.667 --> 00:02:36.267 +the language that you're parsing, + +00:02:36.367 --> 00:02:37.083 +but in general, + +00:02:37.183 --> 00:02:40.083 +this decision was made (as far as I know) + +00:02:40.183 --> 00:02:43.217 +because of the Emacs Lisp + +00:02:43.317 --> 00:02:44.217 +limitation of the time. + +00:02:44.317 --> 00:02:50.233 +So Emacs was a rather + +00:02:50.333 --> 00:02:52.167 +slower Lisp-- slow Lisp-- + +00:02:52.267 --> 00:02:55.850 +so they decide to just use + +00:02:55.950 --> 00:02:58.750 +tag-based thing instead of a parse-- + +00:02:58.850 --> 00:03:02.333 +I mean-- an AST-based one. + +00:03:02.433 --> 00:03:05.167 +And Semantic give you some utility with + +00:03:05.267 --> 00:03:06.250 +that as Senator, for example, give you + +00:03:06.350 --> 00:03:07.667 +some semantic navigation. + +00:03:07.767 --> 00:03:09.750 +So CEDET is way more than this, + +00:03:09.850 --> 00:03:12.433 +but this is not a CEDET talk. + +00:03:12.533 --> 00:03:13.983 +So if you want to get more information, + +00:03:14.083 --> 00:03:16.350 +you can go to the official webpage. + +00:03:16.450 --> 00:03:19.933 +I have to say that it is outdated, and + +00:03:20.033 --> 00:03:22.933 +Emacs changed some things over the years + +00:03:23.033 --> 00:03:24.067 +because CEDET was merged into Emacs + +00:03:24.167 --> 00:03:27.767 +in 2011, as far as I know. + +00:03:27.867 --> 00:03:30.417 +You can also go to the official Emacs + +00:03:30.517 --> 00:03:32.883 +documentation (the manual), which will get + +00:03:32.983 --> 00:03:35.317 +more information about every tool, + +00:03:35.417 --> 00:03:38.317 +but it's a really interesting thing, and + +00:03:38.417 --> 00:03:40.883 +I'm really sad that it is forgotten. + +00:03:40.983 --> 00:03:43.233 +So let's go with the bad things: + +00:03:43.333 --> 00:03:46.483 +that CEDET is an abandoned project. + +00:03:46.583 --> 00:03:48.217 +This has some benefits like it's not + +00:03:48.317 --> 00:03:50.550 +going to change that much, + +00:03:50.650 --> 00:03:52.367 +but it's, of course, not ideal. + +00:03:52.467 --> 00:03:56.833 +Most of the tooling that CEDET + +00:03:56.933 --> 00:03:58.100 +have right now are surpassed + +00:03:58.200 --> 00:03:59.633 +by other packages. + +00:03:59.733 --> 00:04:02.650 +And at first, I know Eric was working + +00:04:02.750 --> 00:04:07.467 +with C at the time so he totally has + +00:04:07.567 --> 00:04:10.533 +"real support" so you can use CEDET + +00:04:10.633 --> 00:04:13.033 +for other languages, but + +00:04:13.133 --> 00:04:15.383 +to work really like an IDE, more or less, + +00:04:15.483 --> 00:04:17.017 +it's all the... + +00:04:17.117 --> 00:04:19.517 +C is the only language supported, + +00:04:19.617 --> 00:04:21.667 +and maybe some simple C++, but that's it. + +00:04:21.767 --> 00:04:24.017 +It needs more documentation. + +00:04:24.117 --> 00:04:25.683 +People really don't know how to use it + +00:04:25.783 --> 00:04:28.583 +because, I have to say, rather complex + +00:04:28.683 --> 00:04:30.067 +to get a project working with it, + +00:04:30.167 --> 00:04:33.717 +and then make use of Semantic + +00:04:33.817 --> 00:04:36.667 +because [it] needs some maintenance and + +00:04:36.767 --> 00:04:38.567 +to update the code. + +00:04:38.667 --> 00:04:41.083 +But I will argue that even with these + +00:04:41.183 --> 00:04:44.383 +deficiencies, it's usable, and + +00:04:44.483 --> 00:04:47.517 +I use the foundation of base for + +00:04:47.617 --> 00:04:49.533 +parse infrastructure for other languages. + +00:04:49.633 --> 00:04:52.367 +I will say that with Common Lisp was + +00:04:52.467 --> 00:04:53.983 +rather easy because + +00:04:54.083 --> 00:04:56.033 +CEDET already have Emacs Lisp parser + +00:04:56.133 --> 00:04:57.900 +even though it's not great. + +00:04:58.000 --> 00:05:00.483 +It's easy to adapt and to use. + +00:05:00.583 --> 00:05:04.000 +It's not used in an Emacs + +00:05:04.100 --> 00:05:05.433 +right now because, well, + +00:05:05.533 --> 00:05:08.883 +Emacs know very well itself, + +00:05:08.983 --> 00:05:11.600 +but it's there. + +00:05:11.700 --> 00:05:17.583 +So these, of course, are static parsers + +00:05:17.683 --> 00:05:19.517 +so you don't need to run any + +00:05:19.617 --> 00:05:21.883 +other language-specific tools, which is + +00:05:21.983 --> 00:05:24.400 +an advantage for some things. + +00:05:24.500 --> 00:05:27.133 +And this was basically CEDET is, + +00:05:27.233 --> 00:05:30.283 +and I use the parse infrastructure + +00:05:30.383 --> 00:05:31.333 +and some tools + +00:05:31.433 --> 00:05:34.333 +to create a parser for Common Lisp. + +00:05:34.433 --> 00:05:36.700 +Well, more or less. *laughs* + +00:05:36.800 --> 00:05:37.900 +Let's go to details. + +00:05:38.000 --> 00:05:39.850 +So I will say that it's not a parser + +00:05:39.950 --> 00:05:42.433 +by itself because, as we all know, + +00:05:42.533 --> 00:05:44.500 +to parse a macro-based language + +00:05:44.600 --> 00:05:46.833 +is really hard. + +00:05:46.933 --> 00:05:48.450 +Mostly if you cannot have contextual + +00:05:48.550 --> 00:05:52.800 +information because if you create code + +00:05:52.900 --> 00:05:56.033 +at compile time or runtime is really hard + +00:05:56.133 --> 00:05:59.233 +if you don't have run time, right? + +00:05:59.333 --> 00:06:00.950 +Basically, CLEDE can be described + +00:06:01.050 --> 00:06:02.600 +as a Semantic extension. + +00:06:02.700 --> 00:06:03.867 +So basically it's like, + +00:06:03.967 --> 00:06:07.133 +you can have Semantic + +00:06:07.233 --> 00:06:09.817 +and use it with Common Lisp code + +00:06:09.917 --> 00:06:11.600 +and some Common Lisp Emacs tools. + +00:06:11.700 --> 00:06:17.350 +So Bison (which is not Bison) is + +00:06:17.450 --> 00:06:21.650 +Bovine, and Semantic and Senator + +00:06:21.750 --> 00:06:24.750 +for navigating tags, + +00:06:24.850 --> 00:06:26.367 +and then communication with SLIME, SLY, + +00:06:26.467 --> 00:06:28.733 +and inferior Lisp. + +00:06:28.833 --> 00:06:30.450 +That means... I will show that later, but + +00:06:30.550 --> 00:06:32.800 +basically, you can parse the buffer, + +00:06:32.900 --> 00:06:34.167 +get some tags, + +00:06:34.267 --> 00:06:35.967 +get information about the tags that you want, + +00:06:36.067 --> 00:06:38.017 +and then send some of that information + +00:06:38.117 --> 00:06:43.900 +to the SLIME, SLY, or inferior Lisp REPL buffer, + +00:06:44.000 --> 00:06:45.717 +so you can get both things + +00:06:45.817 --> 00:06:48.483 +at the same time. + +00:06:48.583 --> 00:06:50.217 +And given that it's a Lisp language, + +00:06:50.317 --> 00:06:53.300 +this can be pretty interesting. + +00:06:53.400 --> 00:06:57.600 +Also I wrote some common package integration, + +00:06:57.700 --> 00:06:59.217 +so even though there's not + +00:06:59.317 --> 00:07:00.300 +a Common Lisp standard, + +00:07:00.400 --> 00:07:05.100 +there's some libraries that are used + +00:07:05.200 --> 00:07:07.583 +by basically everyone. + +00:07:07.683 --> 00:07:09.417 +They're not part of the standard, + +00:07:09.517 --> 00:07:11.000 +but yeah. + +00:07:11.100 --> 00:07:13.900 +A lot of people use it: like `asdf`, + +00:07:14.000 --> 00:07:15.550 +which is the package manager, + +00:07:15.650 --> 00:07:18.967 +I will say it's [`asdf` is] the + +00:07:19.067 --> 00:07:21.783 +definition packages, so to say, + +00:07:21.883 --> 00:07:23.667 +better than packages itself + +00:07:23.767 --> 00:07:26.317 +and have more features. + +00:07:26.417 --> 00:07:28.383 +I wrote a nice integration with it + +00:07:28.483 --> 00:07:29.500 +and also `fiveam`, + +00:07:29.600 --> 00:07:34.417 +which is a well-known test package. + +00:07:34.517 --> 00:07:39.300 +I just wrote this as an example + +00:07:39.400 --> 00:07:41.883 +on how we can do with CLEDE. + +00:07:41.983 --> 00:07:43.633 +Let's look at the features, + +00:07:43.733 --> 00:07:46.267 +and then we go to a demo. + +00:07:51.367 --> 00:07:54.000 +You can go to the repository. + +00:07:54.100 --> 00:07:56.550 +Currently, it's not in Melpa + +00:07:56.650 --> 00:07:57.917 +although I wanted + +00:07:58.017 --> 00:08:01.250 +to merge it-- I mean, to add it-- + +00:08:01.450 --> 00:08:04.667 +to Melpa in the future. + +00:08:04.767 --> 00:08:06.367 +I want to clean the code and + +00:08:06.467 --> 00:08:07.417 +add some more features; + +00:08:07.517 --> 00:08:09.650 +I'm working on that and now + +00:08:09.750 --> 00:08:12.567 +like an eagle, so to say... + +00:08:12.667 --> 00:08:15.533 +but yeah, you can go here and then check + +00:08:15.633 --> 00:08:18.833 +all the features and test it. + +00:08:18.933 --> 00:08:20.733 +To install is pretty easy: + +00:08:20.833 --> 00:08:22.500 +just "add to path" thing. + +00:08:22.600 --> 00:08:23.650 +You don't need any external dependencies; + +00:08:23.750 --> 00:08:25.817 +everything's in Emacs. + +00:08:25.917 --> 00:08:28.467 +This was tested with Emacs 27, + +00:08:28.567 --> 00:08:29.883 +but probably going to work + +00:08:29.983 --> 00:08:32.750 +with Emacs 25 onwards so + +00:08:32.850 --> 00:08:34.267 +it shouldn't be any problem. + +00:08:34.367 --> 00:08:38.633 +So let's go with the features. + +00:08:38.733 --> 00:08:42.783 +This is some CEDET integrations, + +00:08:42.883 --> 00:08:44.417 +and first, like I said, it has + +00:08:44.517 --> 00:08:48.000 +support for SLY, SLIME, and inferior Lisp. + +00:08:48.100 --> 00:08:49.517 +If you are Common Lisp developer, you + +00:08:49.617 --> 00:08:52.267 +probably know a SLIME and a SLY, + +00:08:52.367 --> 00:08:53.483 +and inferior Lisp is basically + +00:08:53.583 --> 00:08:57.800 +just stock Emacs REPL. + +00:08:57.900 --> 00:09:00.817 +I support all three equally, so to say, + +00:09:00.917 --> 00:09:05.583 +and we have also `fiveam` integration, + +00:09:05.683 --> 00:09:08.867 +the ability to-- as I'm going to show later, + +00:09:08.967 --> 00:09:10.883 +you have the ability to send a test-- + +00:09:10.983 --> 00:09:16.233 +either packages or an entire suite of tests, + +00:09:16.333 --> 00:09:21.350 +and `asdf`, which currently I'm just + +00:09:21.450 --> 00:09:23.517 +supporting basic project navigation + +00:09:23.617 --> 00:09:25.433 +and some information, + +00:09:25.533 --> 00:09:28.517 +but it's a work-in-progress. + +00:09:28.617 --> 00:09:29.783 +I also have some general activities + +00:09:29.883 --> 00:09:31.917 +that are not directly related to CEDET + +00:09:32.017 --> 00:09:34.050 +but part of the CLEDE package, which + +00:09:34.150 --> 00:09:35.500 +is CLEDE highlight. + +00:09:35.600 --> 00:09:36.817 +It's highly inspired by the + +00:09:36.917 --> 00:09:41.167 +Emacs re-factor `erefactor`. + +00:09:41.267 --> 00:09:43.950 +Basically, you have some nice + +00:09:44.050 --> 00:09:47.883 +highlights for lint variables. + +00:09:47.983 --> 00:09:49.467 +I want to expand that to also + +00:09:49.567 --> 00:09:53.133 +support parameters and function stuff, + +00:09:53.233 --> 00:09:56.300 +but it's not a high priority for me. + +00:09:56.400 --> 00:09:58.117 +But yeah, I sometimes use this; + +00:09:58.217 --> 00:10:01.950 +it's pretty neat when you have a big lint. + +00:10:02.050 --> 00:10:05.333 +Also some refactoring utilities... + +00:10:05.433 --> 00:10:06.700 +some of those can be said + +00:10:06.800 --> 00:10:08.400 +that it's overlapped with some... + +00:10:08.500 --> 00:10:12.467 +because it is a string base, it doesn't + +00:10:12.567 --> 00:10:15.983 +have too much context information, + +00:10:16.083 --> 00:10:17.967 +but yeah, some sort of + +00:10:18.067 --> 00:10:22.167 +`replace-symbol-in-region` and `symbol-tag`. + +00:10:22.267 --> 00:10:23.867 +And then some CLEDE commands. + +00:10:23.967 --> 00:10:25.500 +This is the thing that I use all the time. + +00:10:25.600 --> 00:10:26.067 +It's like you're going to find + +00:10:26.167 --> 00:10:29.067 +some commands to send to a REPL. + +00:10:29.167 --> 00:10:31.367 +I will show some example, but basically, + +00:10:31.467 --> 00:10:32.983 +you have already an example. + +00:10:33.083 --> 00:10:34.333 +You define a list of commands, + +00:10:34.433 --> 00:10:37.867 +you put name, and then you put the + +00:10:37.967 --> 00:10:39.300 +Common Lisp code that you want to send. + +00:10:39.400 --> 00:10:41.550 +Given that, you're writing this + +00:10:41.650 --> 00:10:43.483 +Emacs Lisp in your configuration. + +00:10:43.583 --> 00:10:46.867 +You can have some runtime information + +00:10:46.967 --> 00:10:49.450 +when the code is sent, right? + +00:10:49.550 --> 00:10:53.450 +so insert, get a variable value, or whatever. + +00:10:53.550 --> 00:10:56.133 +OK, `imenu` integration. + +00:10:56.233 --> 00:10:58.967 +Yes, Semantic... + +00:10:59.067 --> 00:11:02.450 +CEDET has a great `imenu` utilities + +00:11:02.550 --> 00:11:05.600 +to have a better `imenu`. + +00:11:05.700 --> 00:11:10.383 +`imenu-list` also works really well. + +00:11:10.483 --> 00:11:12.917 +So you have better... when you go to a file + +00:11:13.017 --> 00:11:15.200 +that you don't fully know what is inside, + +00:11:15.300 --> 00:11:20.533 +it's better to navigate having like a tree. + +00:11:20.633 --> 00:11:22.383 +Yeah, this one's the thing is going + +00:11:22.483 --> 00:11:24.783 +to show that Senator, which is + +00:11:24.883 --> 00:11:26.633 +Semantic navigator, and then some + +00:11:26.733 --> 00:11:30.217 +Semantic-specific tools like `complete-jump`, + +00:11:30.317 --> 00:11:32.750 +which I don't use this one too much + +00:11:32.850 --> 00:11:35.300 +because we have SLY/SLIME, + +00:11:35.400 --> 00:11:39.083 +but they're there, so yeah. + +00:11:39.183 --> 00:11:41.433 +Like I said, Common Lisp library support, + +00:11:41.533 --> 00:11:44.333 +which is duplicated. + +00:11:44.433 --> 00:11:47.017 +OK, so let's go to the demo. + +00:11:47.117 --> 00:11:50.983 +Um. + +00:11:51.083 --> 00:11:53.567 +Let's go to the demo file. + +00:11:53.667 --> 00:11:55.300 +Right. + +00:11:55.400 --> 00:11:58.250 +First, we have to do is enable CLEDE. + +00:11:58.350 --> 00:11:59.433 +This is pretty easy: + +00:11:59.533 --> 00:12:03.400 +we call `clede-start`, right, + +00:12:03.500 --> 00:12:05.100 +and now it's started. + +00:12:05.200 --> 00:12:08.100 +CLEDE is not an asynchronous parser so + +00:12:08.200 --> 00:12:10.900 +Semantic (in this case, Bovine) is not. + +00:12:11.000 --> 00:12:15.917 +If the file is large, it may take some time. + +00:12:16.017 --> 00:12:16.017 +It shouldn't because we have + +00:12:16.117 --> 00:12:19.117 +powerful computers, but if your + +00:12:19.217 --> 00:12:21.917 +computer is not that powerful, + +00:12:22.017 --> 00:12:22.933 +it may take a while. + +00:12:23.033 --> 00:12:26.117 +To see the information that has been + +00:12:26.217 --> 00:12:31.167 +parsed, we're going to call `bovinate`. + +00:12:31.267 --> 00:12:33.767 +Oops... oops... + +00:12:33.867 --> 00:12:36.033 +Oh! I have to-- sorry... + +00:12:36.133 --> 00:12:43.267 +Let's enable Semantic again. + +00:12:43.367 --> 00:12:45.217 +Let's start... `bovinate`... + +00:12:45.317 --> 00:12:48.117 +OK, so... + +00:12:48.217 --> 00:12:49.917 +This is the information that + +00:12:50.017 --> 00:12:52.983 +currently CLEDE is taking from the buffer. + +00:12:53.083 --> 00:12:55.517 +So we can see it's taking this, and + +00:12:55.617 --> 00:12:58.550 +it doesn't know what it is, + +00:12:58.550 --> 00:13:02.167 +so this is the tag name... + +00:13:02.267 --> 00:13:02.850 +this is the type, + +00:13:02.950 --> 00:13:03.733 +and these are some information + +00:13:03.833 --> 00:13:05.750 +and the location. + +00:13:05.850 --> 00:13:08.150 +OK, so we know that this is a variable, + +00:13:08.250 --> 00:13:10.150 +and it has the full value. + +00:13:10.250 --> 00:13:13.233 +You know this is a package, right, + +00:13:13.333 --> 00:13:15.450 +because it's defined as a package. + +00:13:15.550 --> 00:13:18.100 +It doesn't understand what this is. + +00:13:18.300 --> 00:13:18.967 +This node is a function + +00:13:19.067 --> 00:13:19.817 +because of the `fun`, + +00:13:19.917 --> 00:13:23.133 +and some of this is code, + +00:13:23.233 --> 00:13:25.917 +and it also understands some tests + +00:13:26.017 --> 00:13:27.667 +because it has `fiveam` integration. + +00:13:27.767 --> 00:13:31.000 +If it detects that has some test here + +00:13:31.000 --> 00:13:34.517 +it will know that, indeed, it is test. + +00:13:34.517 --> 00:13:40.317 +So let's try some, first, `imenu`. + +00:13:40.417 --> 00:13:42.550 +So we can see here we have... + +00:13:42.650 --> 00:13:44.750 +I understand that this have + +00:13:44.850 --> 00:13:46.600 +some sort of `fiveam` switch + +00:13:46.700 --> 00:13:49.350 +and some tests defined. + +00:13:49.450 --> 00:13:51.000 +It understands this package, and + +00:13:51.100 --> 00:13:52.783 +it'll give you some variables-- `defuns`, + +00:13:52.883 --> 00:13:55.117 +and it also will give you some misc + +00:13:55.217 --> 00:13:59.917 +for things that doesn't know what it is. + +00:14:00.017 --> 00:14:00.983 +And you can also + +00:14:01.083 --> 00:14:04.417 +navigate with this-- like this `imenu`. + +00:14:06.000 --> 00:14:12.000 +So, um, let's go first with some Senator. + +00:14:12.000 --> 00:14:14.867 +So with Senator, we can navigate, + +00:14:14.967 --> 00:14:16.200 +go to the next stack, previous stack, + +00:14:16.300 --> 00:14:20.783 +all this, um, top-level `s-expression` + +00:14:20.883 --> 00:14:22.467 +are basically a tag, even though + +00:14:22.567 --> 00:14:28.467 +it's code... you can navigate, right. + +00:14:28.567 --> 00:14:31.333 +Um, copy/kill this or some other stuff. + +00:14:31.433 --> 00:14:34.017 +Um, some interesting thing that we can + +00:14:34.117 --> 00:14:38.717 +do is let's launch SLY, right. + +00:14:38.817 --> 00:14:44.317 +Um, let's load `fiveam`, + +00:14:44.417 --> 00:14:45.500 +and let's send some tests. + +00:14:45.600 --> 00:14:51.467 +We can say, OK, `clede-fiveam-send-current-test`, + +00:14:51.567 --> 00:14:53.033 +and it will-- OK, have to compile + +00:14:53.133 --> 00:14:54.750 +this file first. + +00:14:54.850 --> 00:14:55.983 +OK, you don't like this... + +00:14:56.083 --> 00:14:58.367 +you compile the tests. + +00:14:58.467 --> 00:15:03.667 +OK... um... well... + +00:15:03.767 --> 00:15:05.017 +I don't have-- yeah, I don't have + +00:15:05.117 --> 00:15:11.833 +the switch here so let's... + +00:15:11.933 --> 00:15:14.733 +OK, yeah because I guess it's getting... + +00:15:14.833 --> 00:15:19.583 +sorry about this... + +00:15:19.683 --> 00:15:22.983 +Let's say we're going to send this test... + +00:15:23.083 --> 00:15:28.667 +It isn't working... + +00:15:28.767 --> 00:15:36.967 +OK, why are you not working... + +00:15:37.067 --> 00:15:38.450 +maybe because we have to go + +00:15:38.550 --> 00:15:47.083 +to the package `fiveam`. + +00:15:47.183 --> 00:15:49.133 +Yes, sorry... um... + +00:15:49.233 --> 00:15:51.550 +Yeah, so we're gonna go here, and + +00:15:51.650 --> 00:15:54.117 +we can say `fiveam-send-tests`, + +00:15:54.217 --> 00:15:55.250 +and there we have it. + +00:15:55.350 --> 00:15:56.200 +It will send the test + +00:15:56.300 --> 00:16:00.217 +that we are currently in, right. + +00:16:00.317 --> 00:16:01.883 +So that's the thing. + +00:16:01.983 --> 00:16:04.000 +Another interesting thing that I said is + +00:16:04.000 --> 00:16:08.450 +`clede-highlight-minor-mode`. + +00:16:08.550 --> 00:16:11.567 +Basically, work in `let`'s context + +00:16:11.667 --> 00:16:13.450 +to know where to highlight + +00:16:13.550 --> 00:16:17.117 +all the variables, + +00:16:17.217 --> 00:16:20.217 +and we can disable. + +00:16:20.317 --> 00:16:21.833 +What else do we have? + +00:16:21.933 --> 00:16:24.100 +So we have framework integration. + +00:16:24.200 --> 00:16:25.900 +You can go `clede-` and + +00:16:26.000 --> 00:16:27.717 +see what more commands are. + +00:16:27.817 --> 00:16:29.767 +`commands-run` are basically a way + +00:16:29.867 --> 00:16:31.617 +to define commands, you have a variable, + +00:16:31.717 --> 00:16:35.317 +which is `clede-commands-list`. + +00:16:35.417 --> 00:16:37.233 +Let's explain that you can get + +00:16:37.333 --> 00:16:39.817 +some system working + +00:16:39.917 --> 00:16:42.617 +or whatever command you want, right. + +00:16:42.717 --> 00:16:46.083 +Also you have `asdf` basic integration. + +00:16:46.183 --> 00:16:48.067 +You can go to a definition file + +00:16:48.167 --> 00:16:51.050 +of some of the systems are already loaded. + +00:16:51.150 --> 00:16:53.667 +For example, let's go to here, + +00:16:53.767 --> 00:16:55.550 +and we go to the definition file-- + +00:16:55.650 --> 00:16:57.917 +there's the file, right? + +00:16:58.017 --> 00:16:59.000 +This is used because I'm sending + +00:16:59.100 --> 00:17:00.800 +commands for the REPL, so this + +00:17:00.900 --> 00:17:04.117 +functionality is not provided + +00:17:04.217 --> 00:17:09.167 +by CEDET or Semantic, + +00:17:09.267 --> 00:17:11.633 +but I can also get some sort + +00:17:11.733 --> 00:17:19.717 +of information for `asd` file, + +00:17:19.817 --> 00:17:21.550 +which is a work-in-progress, + +00:17:21.650 --> 00:17:23.100 +but you can go to some component file + +00:17:23.200 --> 00:17:24.150 +when you have a big `asd` file + +00:17:24.250 --> 00:17:25.200 +with lots of components + +00:17:25.300 --> 00:17:27.783 +and some other interesting thing. + +00:17:27.883 --> 00:17:30.283 +Like I said, that's a work-in-progress, + +00:17:30.383 --> 00:17:34.967 +Yes, so this is most of the functionality. + +00:17:35.067 --> 00:17:37.000 +The most interesting thing, I think, + +00:17:37.100 --> 00:17:40.267 +is the base for the foundation. + +00:17:40.367 --> 00:17:43.000 +So you can expand: let's go to source code, + +00:17:43.100 --> 00:17:48.333 +for example, that `fiveam`. + +00:17:48.433 --> 00:17:49.900 +So as we can see here, this is + +00:17:50.000 --> 00:17:53.433 +the `fiveam` integration, and to add it, + +00:17:53.533 --> 00:17:58.233 +I just define some new functions, + +00:17:58.333 --> 00:18:01.983 +and then you use this... + +00:18:02.083 --> 00:18:04.150 +set up a new form parser that we use + +00:18:04.250 --> 00:18:06.400 +to get some information + +00:18:06.500 --> 00:18:09.150 +about the `s-expression` top-level, + +00:18:09.250 --> 00:18:10.433 +and we define the names, + +00:18:10.533 --> 00:18:11.617 +we define information we want to take + +00:18:11.717 --> 00:18:13.700 +from the symbol and everything else. + +00:18:13.800 --> 00:18:17.133 +Also some [??] types + +00:18:17.233 --> 00:18:19.367 +that would be going to be added + +00:18:19.467 --> 00:18:21.067 +to the `imenu` thing: + +00:18:21.167 --> 00:18:24.033 +for example, `imenu test switch and test`. + +00:18:24.133 --> 00:18:27.317 +And then, these are, for example, + +00:18:27.417 --> 00:18:29.333 +some function to send information + +00:18:29.433 --> 00:18:33.483 +to the SLY, SLIME, or inferior Lisp + +00:18:33.583 --> 00:18:37.050 +depending on the Lisp that you're using. + +00:18:37.150 --> 00:18:39.400 +So I do not have more time. + +00:18:39.500 --> 00:18:40.367 +Sorry about that. + +00:18:40.467 --> 00:18:44.917 +Thank you very much. + +00:18:45.017 --> 00:18:46.383 +My name is Fermin. + +00:18:46.483 --> 00:18:49.733 +You can send me a mail in my mail, + +00:18:49.833 --> 00:18:51.233 +and that's my webpage. + +00:18:51.333 --> 00:18:54.950 +I hope you like it. diff --git a/2021/info/clede-schedule.md b/2021/info/clede-schedule.md index 5f327ba7..2bfe4d4f 100644 --- a/2021/info/clede-schedule.md +++ b/2021/info/clede-schedule.md @@ -10,7 +10,8 @@ If you have questions and the speaker has not indicated public contact informati # Talk [[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.png" -size="39.8M" duration="18:55" other_resources="""[Download --compressed56.webm (24.6MB)](https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--compressed56.webm) +size="39.8M" duration="18:55" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt" default />""" other_resources="""[Download --compressed56.webm (24.6MB)](https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--compressed56.webm) +[Download --main.vtt](emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt) [View on Toobnix](https://toobnix.org/w/1HuHMank52gcpHqf4M7Sa5) """]] diff --git a/2021/talks/clede.md b/2021/talks/clede.md index 4a4229e0..59bb10f6 100644 --- a/2021/talks/clede.md +++ b/2021/talks/clede.md @@ -10,13 +10,6 @@ Fermin MF [[!inline pages="internal(2021/info/clede-schedule)" raw="yes"]] -[[!template id="help" tags="help_with_main_captions" -summary="main talk does not have captions" -volunteer="Hannah Miller 2021-12-22" -message="""This talk does not have captions yet. Would you like to help [caption this talk](/captioning/)? You may be able to start with these -[autogenerated captions](https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt) -and [timing information](https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf.en.srv2)."""]] - I've been developing a package that helps with the development of Common Lisp's software, it's uses the internal semantic framework, it has a custom reader |