diff options
Diffstat (limited to '2024')
4 files changed, 1898 insertions, 2 deletions
diff --git a/2024/captions/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main--chapters.vtt b/2024/captions/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main--chapters.vtt new file mode 100644 index 00000000..89190453 --- /dev/null +++ b/2024/captions/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main--chapters.vtt @@ -0,0 +1,35 @@ +WEBVTT + + +00:00:00.000 --> 00:01:41.800 +Introduction + +00:01:41.800 --> 00:07:45.719 +Android + +00:07:45.720 --> 00:09:27.320 +EditorConfig + +00:09:27.310 --> 00:13:11.559 +use-package integration with package-vc + +00:13:11.560 --> 00:15:56.679 +JSON + +00:15:56.680 --> 00:17:29.639 +Native compilation + +00:17:29.640 --> 00:18:16.779 +Tree-sitter + +00:18:16.780 --> 00:19:34.200 +Completion preview mode + +00:19:34.233 --> 00:21:16.919 +package-isolate + +00:21:16.920 --> 00:23:17.939 +Reindenting + +00:23:17.940 --> 00:24:43.766 +Wrapping up diff --git a/2024/captions/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main.vtt b/2024/captions/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main.vtt new file mode 100644 index 00000000..f0d08f0b --- /dev/null +++ b/2024/captions/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main.vtt @@ -0,0 +1,1361 @@ +WEBVTT captioned by anush and sachac, checked by anush and bhavin + +NOTE Introduction + +00:00.000 --> 00:06.066 +Hello, and welcome to Emacs 30 Highlights at EmacsConf 2024. + +00:06.100 --> 00:08.833 +Before I begin, I'd like to thank the organizers + +00:08.866 --> 00:11.800 +and everyone involved for putting this all together. + +00:11.800 --> 00:13.733 +While this talk is being pre-recorded, + +00:13.766 --> 00:15.233 +my experience from the last few years + +00:15.266 --> 00:19.100 +assures me that it will be a great experience for everyone. + +00:19.133 --> 00:21.300 +My name is Philip Kaludercic. + +00:21.333 --> 00:24.466 +I am a core contributor and ELPA co-maintainer. + +00:24.500 --> 00:26.066 +I was honored when Sacha asked me + +00:26.100 --> 00:28.333 +to take over the slot for this year. + +00:28.366 --> 00:29.866 +In the past few iterations, + +00:29.900 --> 00:32.133 +John Wiegley has filled a similar presentation + +00:32.166 --> 00:35.666 +focusing on more general Emacs development updates. + +00:35.700 --> 00:00:38.501 +This year, I will specifically focus on + +00:00:38.502 --> 00:00:41.900 +highlight features from the upcoming Emacs 30 release, + +00:41.933 --> 00:44.200 +which might or might not have been released + +00:44.200 --> 00:00:48.059 +by the time you are seeing this. + +00:00:48.060 --> 00:51.266 +As you can imagine, everything new about Emacs + +00:51.300 --> 00:55.133 +can always be found in the Emacs NEWS file. + +00:55.166 --> 00:57.100 +Or, alternatively, + +00:57.133 --> 01:01.800 +if one doesn't want to read through the 3,000 lines here, + +01:01.800 --> 01:05.233 +one can also take a look at the Emacs FAQ + +01:05.266 --> 01:08.000 +and then go to the what's new about + +01:08.000 --> 01:12.300 +or what's different about Emacs 30 node. + +01:12.333 --> 01:14.700 +Next to these two official options, + +01:14.733 --> 01:18.200 +I also have a page on Emacs Wiki + +01:18.200 --> 01:21.300 +called EmacsThirtyHighlights, + +01:21.333 --> 01:24.266 +highlighting some of the interesting features + +01:24.300 --> 01:28.433 +with some context and suggestions on how to try them out. + +01:28.466 --> 01:30.033 +This is more of a collaborative effort. + +01:30.066 --> 01:32.733 +So if you see this and think something is missing, + +01:32.766 --> 01:34.500 +feel free to add it. + +01:34.533 --> 01:36.833 +So without further ado, + +01:36.866 --> 01:41.800 +let's begin taking a look at new features in Emacs 30. + +NOTE Android + +01:41.800 --> 01:44.700 +The biggest one, and the one I want to mention first, + +01:44.733 --> 01:49.033 +is Android support, native Android support. + +01:49.066 --> 01:51.833 +As you can see here, Emacs has been ported + +01:51.866 --> 01:53.666 +to the Android operating system. + +01:53.700 --> 01:56.500 +What this means is that from Emacs 30 onwards, + +01:56.533 --> 02:01.066 +you can build Android to target Android devices natively + +02:01.100 --> 02:06.733 +and using a graphical interface. + +02:06.766 --> 02:08.433 +While it has been possible to run Emacs + +02:08.466 --> 02:11.133 +inside of terminal emulators on Android for a while, + +02:11.166 --> 02:13.900 +this actually means that you can use Emacs + +02:13.933 --> 02:17.533 +on an Android device, a phone or a tablet, + +02:17.566 --> 02:20.933 +and have all the usual advantages from GUI Emacs, + +02:20.966 --> 02:23.466 +such as the ability to bind all commands + +02:23.500 --> 02:25.466 +without having to worry about-- + +02:25.500 --> 02:27.266 +all keys without having to worry + +02:27.300 --> 02:29.033 +about terminal compatibility issues, + +02:29.066 --> 02:32.733 +displaying images and multiple fonts + +02:32.766 --> 02:35.333 +on the same display of different sizes. + +02:35.366 --> 02:37.300 +I should have a recording + +02:37.333 --> 02:42.200 +of that somewhere here--here we are-- + +02:42.200 --> 02:44.100 +which I made earlier on my phone, + +02:44.133 --> 02:47.266 +because I'm recording this on a laptop-- + +02:47.300 --> 02:50.466 +where we can see how touch interaction works + +02:50.500 --> 02:53.333 +on an Android phone. I can switch between buffers. + +02:53.366 --> 02:56.100 +Here I've connected an external keyboard, + +02:56.133 --> 02:57.800 +opening the Emacs website. + +02:57.800 --> 00:03:02.559 +We have images that we can interact with. + +00:03:02.560 --> 00:03:04.319 +We could resize them if we wanted to + +00:03:04.320 --> 03:07.400 +with the image resizing commands. + +03:07.400 --> 03:10.300 +Pinch-to-zoom works, so it + +03:10.333 --> 03:12.733 +does realize what touchscreen interactions are. + +03:12.766 --> 03:15.233 +With an external mouse, and for example, + +03:15.266 --> 03:17.800 +enabling context menu mode, + +03:17.800 --> 03:23.066 +I can even pop up little interaction windows, + +03:23.100 --> 00:03:28.139 +which one you would usually also know from GUI Emacs. + +00:03:28.140 --> 03:33.200 +TUI Emacs actually also supports them since a while now. + +03:33.200 --> 03:34.600 +And in this case, I'm demonstrating + +03:34.600 --> 03:36.000 +how even the touchscreen events + +03:36.000 --> 03:39.133 +can be inspected using the usual help system, + +03:39.166 --> 03:43.333 +and how context-mode notices + +03:43.366 --> 03:45.200 +where we are and allows me to, for example, + +03:45.200 --> 03:47.800 +evaluate this specific region, + +03:47.800 --> 03:49.300 +which I've highlighted down there, + +03:49.333 --> 03:58.300 +binding a command to touch-screen-scroll. Yeah. + +03:58.333 --> 04:00.533 +One should note that these additions, + +04:00.566 --> 04:02.400 +for example touchscreen interaction, + +04:02.400 --> 04:03.833 +are not specific to Android, + +04:03.866 --> 04:07.066 +but they also are supported in other operating systems, + +04:07.100 --> 04:12.200 +such as Wayland and Xorg, which are not operating systems, + +04:12.200 --> 04:15.300 +and Windows, insofar as they have touchscreen, + +04:15.333 --> 00:04:18.419 +and devices have touchscreen support. + +00:04:18.420 --> 04:21.300 +One should mention, or I want to mention, + +04:21.333 --> 04:24.666 +that the main developer behind this feature, Po Lu, + +04:24.700 --> 04:27.500 +should be complimented for the additional effort he put + +04:27.533 --> 00:04:31.019 +into making sure that Emacs for Android + +00:04:31.020 --> 04:34.133 +can be built using only a free software toolchain, + +04:34.166 --> 00:04:36.359 +which is certainly not something one has come to expect + +00:04:36.360 --> 04:40.700 +from working on Android applications, + +04:40.733 --> 04:43.833 +as usually you have to agree to some terms and conditions + +04:43.866 --> 00:04:46.519 +for Google-specific software. + +00:04:46.520 --> 04:49.633 +Final note is that if you try and look for this online, + +04:49.666 --> 04:52.133 +there are APKs you can find, + +04:52.166 --> 04:54.666 +but some of them might be outdated. + +04:54.700 --> 04:59.333 +To the best of my knowledge, Po Lu has... + +04:59.366 --> 05:03.400 +Emacs 30 Android Sourceforge... + +05:03.400 --> 05:06.500 +He has set up some system where here in Sourceforge, + +05:06.533 --> 05:12.433 +there are regular and updated + +05:12.466 --> 05:14.500 +APK files which you can download + +05:14.533 --> 05:16.933 +to avoid having to build it yourself, + +05:16.966 --> 05:18.866 +testing out the newest version + +05:18.900 --> 05:24.133 +in case there are some bugs which you'd like to report. + +05:24.166 --> 05:33.100 +Which-key is a package which has now been moved + +05:33.133 --> 05:35.266 +from ELPA to the core. + +05:35.300 --> 00:05:39.179 +If you haven't heard of which-key before, the idea is, + +00:05:39.180 --> 05:41.633 +or the general pitch is that which-key + +05:41.666 --> 05:45.233 +is a additional documentation interface for Emacs + +05:45.266 --> 05:49.700 +for displaying various keys which you could input, + +05:49.733 --> 00:05:53.439 +or various keys and key maps + +00:05:53.440 --> 05:54.833 +that have been partially inputted. + +05:54.866 --> 05:57.633 +A better way to demonstrate this + +05:57.666 --> 05:59.300 +or to explain this is just to show it. + +05:59.333 --> 06:03.466 +If we enable the which-key mode--it's a global minor mode-- + +06:03.500 --> 06:06.333 +then I can press, for example, C-x, + +06:06.366 --> 06:08.700 +which is a prefix for the C-x keymap. + +06:08.733 --> 06:12.433 +Then down here in the buffer, in this window down here, + +06:12.466 --> 06:15.333 +we see various commands which we could invoke + +06:15.366 --> 06:17.900 +and the keys to invoke them with. + +06:17.933 --> 06:23.000 +For example, if I wanted to say C-x i for insert-file, + +06:23.000 --> 06:27.233 +then I just have to press i to highlight it once again. + +06:27.266 --> 06:32.600 +It should be down here. Pressing i without having to repeat + +06:32.600 --> 06:34.733 +the entire key code again, + +06:34.766 --> 06:37.200 +the partial key code again, just works. + +06:37.200 --> 06:41.533 +This is different from the feature which Emacs has already, + +06:41.566 --> 06:45.400 +which is if you have input the partial keychord, + +06:45.400 --> 06:47.033 +you can press C-h + +06:47.066 --> 06:51.000 +and then a help buffer pops up with a listing + +06:51.000 --> 06:54.066 +of all keybindings that start with C-x. + +06:54.100 --> 06:56.633 +The information is the same, the presentation is different, + +06:56.666 --> 06:59.066 +because now if I wanted to do C-x i, + +06:59.100 --> 00:07:03.339 +I have to repeat the entire keychord again. + +00:07:03.340 --> 07:09.466 +So it's a matter of personal preference, which you prefer. + +07:09.500 --> 00:07:10.959 +This is more of a traditional static approach + +00:07:10.960 --> 07:19.633 +because I get a help buffer which I can search + +07:19.666 --> 07:20.900 +using usual key commands, + +07:20.933 --> 07:28.133 +while which-key is more of a transient and modern. + +07:28.166 --> 07:31.400 +Some might prefer that approach + +07:31.400 --> 00:07:35.719 +to solving the same problem. + +00:07:35.720 --> 07:39.100 +Also, don't forget to check out the customization group + +07:39.133 --> 07:41.933 +for which-key which has a number of options + +07:41.966 --> 00:07:45.719 +which you might or might not be interested in. + +NOTE EditorConfig + +00:07:45.720 --> 07:50.866 +Next up, Emacs 30 has built-in EditorConfig support. + +07:50.900 --> 07:53.633 +If you have not heard of EditorConfig before, + +07:53.666 --> 00:07:56.639 +I believe I've linked to it down here somewhere. + +00:07:56.640 --> 00:08:00.119 +Ah, there it is, EditorConfig. + +00:08:00.120 --> 00:08:09.419 +This is a file format used to specify + +00:08:09.420 --> 08:12.133 +common formatting rules in an editor-agnostic way. + +08:12.166 --> 08:16.266 +You might compare it to .dir-locals.el files, + +08:16.300 --> 08:19.333 +which is a sort of an s-expression + +08:19.366 --> 08:22.233 +for setting file-local variables in Emacs. + +08:22.266 --> 08:27.266 +Of course, this is restricted to the common subset + +08:27.300 --> 08:29.400 +of what all editors should understand. + +08:29.400 --> 08:31.833 +For example, indentation styles, + +08:31.866 --> 00:08:35.119 +whether you prefer tabs or spaces, + +00:08:35.120 --> 08:38.733 +tab width, file encoding, and so on. + +08:38.766 --> 00:08:43.919 +So it's nothing too advanced, but it's something... + +00:08:43.920 --> 08:48.500 +It is a file format which one sees popping up more + +08:48.533 --> 08:50.433 +and more often in lots of projects + +08:50.466 --> 08:53.600 +which want to enforce a consistent indentation style + +08:53.600 --> 08:56.633 +or formatting rules for all editors in a project. + +08:56.666 --> 09:00.200 +Having this built in is certainly useful in Emacs. + +09:00.200 --> 09:03.466 +Though one should note that it's not enabled by default. + +09:03.500 --> 00:09:10.939 +You still have to enable the global minor mode, + +00:09:10.940 --> 09:14.200 +which is simply turning on this one option. + +09:14.200 --> 09:15.500 +Shouldn't be more than that, + +09:15.533 --> 09:18.633 +and then Emacs will respect the rules. + +09:18.666 --> 00:09:23.640 +If it finds a .editorconfig file in the project directory, + +00:09:23.641 --> 00:09:25.320 +then it will respect those rules + +00:09:25.321 --> 00:09:27.320 +without having to do anything else. + +NOTE use-package integration with package-vc + +00:09:27.310 --> 00:09:33.567 +Next up, use-package integration with package-vc. + +00:09:33.568 --> 00:09:36.533 +For those not familiar with either of the two, + +00:09:36.534 --> 00:09:37.533 +or at least one of the two, + +00:09:37.534 --> 00:09:40.699 +use-package is a popular configuration macro. + +00:09:40.700 --> 00:09:42.833 +What it does is it allows + +00:09:42.866 --> 00:09:46.233 +users to declaratively specify packages + +00:09:46.266 --> 00:09:48.900 +they would like to have installed and configured + +00:09:48.900 --> 00:09:51.659 +in their configuration file, + +00:09:51.660 --> 00:09:54.400 +so that, for example, if you copy your init.el + +00:09:54.433 --> 00:09:55.900 +from one system to another, + +00:09:55.900 --> 00:09:58.500 +it could bootstrap the entire configuration, + +00:09:58.500 --> 00:10:00.733 +downloading all the packages you want + +00:10:00.766 --> 00:10:02.366 +without having to manually do this + +00:10:02.400 --> 00:10:05.139 +on every system you'd like to use. + +00:10:05.140 --> 00:10:07.600 +This allows configurations + +00:10:07.633 --> 00:10:10.859 +to be self-encapsulated and portable. + +00:10:10.860 --> 00:10:15.059 +package-vc is an extension of package.el, + +00:10:15.060 --> 00:10:19.400 +which allows installing packages from an alternative. + +00:10:19.433 --> 00:10:22.366 +Instead of using the standard way to install packages, + +00:10:22.400 --> 00:10:26.499 +which is just download tarball and unpack it, + +00:10:26.500 --> 00:10:27.933 +byte compile, and so on, + +00:10:27.966 --> 00:10:32.399 +it will fetch the files for a package + +00:10:32.400 --> 00:10:34.966 +directly from the source code repository + +00:10:35.000 --> 00:10:37.233 +and initialize it in such a way + +00:10:37.266 --> 00:10:38.800 +that package.el can work with it. + +00:10:38.833 --> 00:10:44.239 +So it's just a front-end for installing packages. + +00:10:44.240 --> 00:10:46.500 +Even though these two were added to Emacs 29, + +00:10:46.500 --> 00:10:48.366 +we didn't have the time to work on the + +00:10:48.400 --> 00:10:52.500 +use-package integration of package-vc into use-package, + +00:10:52.500 --> 00:10:54.600 +which has been changed now. + +00:10:54.633 --> 00:11:00.139 +What we have with Emacs 30 is that + +00:11:00.140 --> 00:11:02.833 +there is a :vc keyword for use-package + +00:11:02.866 --> 00:11:05.200 +with which we can instruct use-package + +00:11:05.233 --> 00:11:10.239 +to not download a package using tarball, + +00:11:10.240 --> 00:11:12.433 +but instead to fetch the source code + +00:11:12.466 --> 00:11:13.766 +from a source code repository. + +00:11:13.800 --> 00:11:15.566 +This is useful if you, for example, + +00:11:15.600 --> 00:11:18.200 +have packages which you yourself work on + +00:11:18.233 --> 00:11:19.933 +and know that you always want to have + +00:11:19.966 --> 00:11:21.900 +the development version of the package + +00:11:21.900 --> 00:11:26.819 +where you can directly commit changes you've made + +00:11:26.820 --> 00:11:29.733 +to the repository and push them upstream. + +00:11:29.766 --> 00:11:32.100 +Or, if you know that you want to contribute to a package, + +00:11:32.100 --> 00:11:34.966 +you can use package-vc to download the source code, + +00:11:35.000 --> 00:11:37.366 +have all the version control information, + +00:11:37.400 --> 00:11:41.739 +prepare a patch and send it upstream. + +00:11:41.740 --> 00:11:43.800 +In these examples here, + +00:11:43.833 --> 00:11:49.166 +the first example Lisp instructs package-vc + +00:11:49.200 --> 00:11:52.366 +to download the source code from a URL. + +00:11:52.400 --> 00:11:55.400 +So this is a git URL where it will download + +00:11:55.433 --> 00:11:57.400 +the source code from, and in this case, + +00:11:57.433 --> 00:12:00.000 +choose the newest checkout of the source code, + +00:12:00.033 --> 00:12:04.939 +not the latest release. Down here, we have another example. + +00:12:04.940 --> 00:12:08.766 +I prefer to consider the following example here. + +00:12:08.800 --> 00:12:10.733 +If we just had written this, + +00:12:10.766 --> 00:12:13.200 +then package-vc would use the metadata + +00:12:13.233 --> 00:12:15.000 +which an ELPA server provides + +00:12:15.033 --> 00:12:20.166 +to fetch the URL from the official repository of, + +00:12:20.200 --> 00:12:22.833 +in this case, BBDB, without having to... + +00:12:22.866 --> 00:12:27.733 +It would be more or less the same like this up here, + +00:12:27.766 --> 00:12:32.700 +with the simple difference that package-vc integration + +00:12:32.700 --> 00:12:36.300 +into use-package doesn't check out the latest commit, + +00:12:36.300 --> 00:12:37.766 +but the latest release, + +00:12:37.800 --> 00:12:44.979 +just to keep configurations more deterministic by default. + +00:12:44.980 --> 00:12:47.566 +Of course, if you prefer to use latest commit, + +00:12:47.600 --> 00:12:52.179 +you can use a package-vc install command + +00:12:52.180 --> 00:12:54.933 +or just update the package manually yourself, + +00:12:54.966 --> 00:13:01.779 +which you can use using package-vc-upgrade. + +00:13:01.780 --> 00:13:04.366 +Next, I'd like to focus on a few features + +00:13:04.400 --> 00:13:07.000 +which one might not necessarily realize directly, + +00:13:07.033 --> 00:13:11.559 +but will hopefully improve your experience with Emacs. + +NOTE JSON + +00:13:11.560 --> 00:13:15.133 +First up in this list is a new JSON parser. + +00:13:15.166 --> 00:13:21.959 +Let's maybe show the source code for that one: + +00:13:21.960 --> 00:13:39.533 +not json.el, json.c. The history of JSON parsing in Emacs + +00:13:39.566 --> 00:13:43.366 +started with Emacs 23 with the addition of json.el. + +00:13:43.400 --> 00:13:46.766 +This was the file which we had just opened a moment ago. + +00:13:46.800 --> 00:13:50.366 +This is a JSON parser in Emacs Lisp. + +00:13:50.400 --> 00:13:53.233 +It's fine, it does the job, but it can get slow + +00:13:53.266 --> 00:13:55.000 +if we have a situation like where + +00:13:55.033 --> 00:14:00.319 +Eglot uses a LSP server to communicate with + +00:14:00.320 --> 00:14:02.999 +and the LSP server can get a bit chatty, + +00:14:03.000 --> 00:14:05.133 +sending a lot of JSON data, + +00:14:05.166 --> 00:14:07.966 +which all has to be parsed and garbage collected, + +00:14:08.000 --> 00:14:09.933 +which can slow down Emacs a bit. + +00:14:09.966 --> 00:14:13.733 +The situation was improved upon in Emacs 29 + +00:14:13.766 --> 00:14:18.000 +when JSON parsing was added to the core. + +00:14:18.033 --> 00:14:21.000 +This was the json.c file, which we see on this side, + +00:14:21.033 --> 00:14:22.733 +the old version of the json.c file, + +00:14:22.766 --> 00:14:26.700 +which employed the Jansson library (it's the C library) + +00:14:26.700 --> 00:14:31.899 +for parsing and accelerating JSON parsing in Emacs. + +00:14:31.900 --> 00:14:33.966 +This was good enough, + +00:14:34.000 --> 00:14:36.200 +or it certainly improved the situation + +00:14:36.233 --> 00:14:38.300 +for a lot of LSP clients. + +00:14:38.300 --> 00:14:44.766 +But in Emacs 30, the situation has been improved once more + +00:14:44.800 --> 00:14:49.800 +with the addition of a JSON parser directly in Emacs. + +00:14:49.833 --> 00:14:53.566 +So instead of using an external library, + +00:14:53.600 --> 00:14:57.400 +there's a custom JSON parser written in C in the Emacs core, + +00:14:57.433 --> 00:15:01.539 +which directly generates Elisp objects. + +00:15:01.540 --> 00:15:05.033 +The advantage to this approach + +00:15:05.066 --> 00:15:06.433 +compared to the Jansson approach + +00:15:06.466 --> 00:15:07.933 +is that there's no intermediate format + +00:15:07.966 --> 00:15:09.200 +which has to be allocated + +00:15:09.233 --> 00:15:11.500 +and memory managed and freed again, + +00:15:11.500 --> 00:15:19.539 +which of course incurs an additional performance overhead. + +00:15:19.540 --> 00:15:22.433 +Next to this, there's also a custom serializer + +00:15:22.466 --> 00:15:29.239 +for JSON contents translating a JSON object into a string. + +00:15:29.240 --> 00:15:30.640 +... The consequence of this is that + +00:15:30.641 --> 00:15:35.519 +there is absolutely no dependency on Jansson anymore. + +00:15:35.520 --> 00:15:38.533 +This in turn means that now all Emacs users + +00:15:38.566 --> 00:15:39.800 +from Emacs 30 onwards + +00:15:39.833 --> 00:15:42.733 +can take advantage of this new JSON parser + +00:15:42.766 --> 00:15:44.933 +and don't have to worry about whether + +00:15:44.966 --> 00:15:47.633 +or not they have Jansson, this JSON parsing library, + +00:15:47.666 --> 00:15:50.433 +installed on their system or not when they want + +00:15:50.466 --> 00:15:56.679 +to take advantage of this accelerated JSON parsing. + +NOTE Native compilation + +00:15:56.680 --> 00:16:00.366 +Next up, another behind-the-scenes feature + +00:16:00.400 --> 00:16:06.406 +is that if you build Emacs on your own from source, + +00:16:06.407 --> 00:16:07.766 +you might know that if you wanted + +00:16:07.800 --> 00:16:09.533 +to use native compilation, + +00:16:09.566 --> 00:16:12.379 +so the translation of Elisp bytecodes + +00:16:12.380 --> 00:16:15.533 +to whatever the native assembly + +00:16:15.566 --> 00:16:19.133 +or native instruction set is on your system, + +00:16:19.166 --> 00:16:24.339 +you have to specify with native compilation. + +00:16:24.340 --> 00:16:25.933 +when invoking the configure script, + +00:16:25.966 --> 00:16:28.366 +otherwise it would not have been enabled at all. + +00:16:28.400 --> 00:16:32.479 +With Emacs 30, this step is not necessary anymore. + +00:16:32.480 --> 00:16:36.233 +The configure script will automatically check + +00:16:36.266 --> 00:16:41.700 +if you have the libgccjit library installed on your system, + +00:16:41.700 --> 00:16:42.766 +and if that is so, + +00:16:42.800 --> 00:16:45.566 +then native compilation will be enabled by default. + +00:16:45.600 --> 00:16:49.400 +In other words, if you have an issue with native compilation + +00:16:49.433 --> 00:16:52.500 +or prefer not to use it for whatever reason, + +00:16:52.500 --> 00:16:55.533 +you now have to type --without-native-compilation + +00:16:55.566 --> 00:16:58.433 +when compiling Emacs to prevent this from happening. + +00:16:58.466 --> 00:17:02.433 +But native compilation was added in Emacs 28 + +00:17:02.466 --> 00:17:04.333 +and has proven to be a very stable + +00:17:04.366 --> 00:17:06.233 +and useful feature for most people, + +00:17:06.266 --> 00:17:09.400 +so there's probably no reason to do this + +00:17:09.433 --> 00:17:11.133 +and you can just invoke the configure script + +00:17:11.166 --> 00:17:16.300 +with one argument less. Right, and I'd like to finish up + +00:17:16.300 --> 00:17:19.500 +with a few smaller features, a few smaller highlights. + +00:17:19.500 --> 00:17:29.639 +Maybe we can go back to the listing here. Here we have it. + +NOTE Tree-sitter + +00:17:29.640 --> 00:17:32.833 +There are a few new major modes + +00:17:32.866 --> 00:17:34.333 +based on the tree-sitter library. + +00:17:34.366 --> 00:17:37.939 +tree-sitter is this parser library + +00:17:37.940 --> 00:17:39.933 +which has been integrated into Emacs 29. + +00:17:39.966 --> 00:17:44.100 +It allows the integration + +00:17:44.100 --> 00:17:48.400 +of external, specialized, and quick parsers into Emacs, + +00:17:48.433 --> 00:17:52.133 +which improve stuff like syntax highlighting, indentation, + +00:17:52.166 --> 00:17:55.233 +structural navigation, imenu support, + +00:17:55.266 --> 00:18:01.033 +by simply having a better understanding of, for example, + +00:18:01.066 --> 00:18:03.900 +a HTML file, or a Lua file, a PHP file, + +00:18:03.900 --> 00:18:06.233 +than what people usually implement + +00:18:06.266 --> 00:18:10.366 +using regular expressions in traditional major modes. + +00:18:10.400 --> 00:18:16.779 +So, a few new major modes which you can try out here. + +NOTE Completion preview mode + +00:18:16.780 --> 00:18:20.033 +Another interesting feature is the completion-preview-mode. + +00:18:20.066 --> 00:18:22.966 +We can maybe try it out here in the scratch buffer. + +00:18:23.000 --> 00:18:28.300 +If I enable completion-preview-mode... + +00:18:28.300 --> 00:18:32.033 +This is a non-global minor mode, + +00:18:32.066 --> 00:18:38.600 +which will display completion options inline using overlays. + +00:18:38.633 --> 00:18:43.133 +For example, if I start typing a longer symbol like define, + +00:18:43.166 --> 00:18:48.200 +now we have a derived mode. It suggests me to... + +00:18:48.233 --> 00:18:51.133 +I can just press TAB and then it completes the option here, + +00:18:51.166 --> 00:18:51.933 +but it didn't actually... + +00:18:51.966 --> 00:18:55.333 +It's not actually modifying the buffer, it's not pressing, + +00:18:55.366 --> 00:18:57.100 +these are just overlays, + +00:18:57.100 --> 00:18:59.533 +so if I move around, it gets deleted. + +00:18:59.566 --> 00:19:02.619 +It wouldn't get saved if I were to save the buffer. + +00:19:02.620 --> 00:19:04.966 +The same also should work in a shell buffer. + +00:19:05.000 --> 00:19:08.366 +If I enable completion preview mode here and start... + +00:19:08.400 --> 00:19:12.800 +In this case, I'm using the bash completion package, + +00:19:12.833 --> 00:19:15.000 +which provides additional completion information. + +00:19:15.033 --> 00:19:17.933 +This is not only limited to programming systems, + +00:19:17.966 --> 00:19:22.900 +but anywhere where you have completion at point in Emacs. + +00:19:22.900 --> 00:19:26.159 +I can start typing here, ignore, and put ignore-backups, + +00:19:26.160 --> 00:19:30.000 +and it hints to the options which I have + +00:19:30.033 --> 00:19:34.200 +and allows me to complete them quickly. + +NOTE package-isolate + +00:19:34.233 --> 00:19:37.966 +Another small feature is the package-isolate command. + +00:19:38.000 --> 00:19:40.000 +What this does is it will start + +00:19:40.033 --> 00:19:42.800 +or it will prompt me for packages + +00:19:42.833 --> 00:19:44.333 +I have installed in my system + +00:19:44.366 --> 00:19:46.500 +and will start an isolated + +00:19:46.500 --> 00:19:51.133 +or like "emacs -Q"-ish instance of emacs + +00:19:51.166 --> 00:19:53.333 +with only these packages installed. + +00:19:53.366 --> 00:20:00.439 +So for example, if I said I want slime and I want diff-hl, + +00:20:00.440 --> 00:20:02.700 +then this is a new Emacs window. + +00:20:02.700 --> 00:20:04.533 +It's unrelated to the one around. + +00:20:04.566 --> 00:20:06.500 +It uses the same executable, of course, + +00:20:06.500 --> 00:20:09.939 +but will not load your configuration file + +00:20:09.940 --> 00:20:13.679 +or any other further customizations on your system. + +00:20:13.680 --> 00:20:15.533 +All it does, it will ensure + +00:20:15.566 --> 00:20:17.933 +that these packages, which are listed here, + +00:20:17.966 --> 00:20:24.599 +so in our case SLIME and dependencies of SLIME and diff-hl, + +00:20:24.600 --> 00:20:25.300 +in the system + +00:20:25.300 --> 00:20:29.100 +so that I could, for example, as you can see here, + +00:20:29.100 --> 00:20:32.139 +diff-hl-mode works. + +00:20:32.140 --> 00:20:34.766 +Okay, this is not a version-controlled file. + +00:20:34.800 --> 00:20:41.200 +Maybe if we take a look at, have I enabled diff-hl-mode? + +00:20:41.233 --> 00:20:44.600 +It's enabled in this case. What diff-hl-mode does + +00:20:44.633 --> 00:20:48.300 +is it displays these version control changes + +00:20:48.300 --> 00:20:49.566 +in the fringe of a buffer. + +00:20:49.600 --> 00:20:54.133 +And even though this is a uncustomized version of Emacs, + +00:20:54.166 --> 00:20:56.333 +or an uncustomized instance of Emacs, + +00:20:56.366 --> 00:20:59.000 +it was easy for me to load this one package, + +00:20:59.033 --> 00:21:02.033 +or these two packages and all the dependencies necessary. + +00:21:02.066 --> 00:21:05.300 +As you can imagine, the main purpose for this + +00:21:05.300 --> 00:21:07.733 +is to make debugging issues easier. + +00:21:07.766 --> 00:21:10.566 +If you want to report about an issue + +00:21:10.600 --> 00:21:14.900 +you have with a package. And if I close this, it's closed + +00:21:14.900 --> 00:21:16.919 +and everything's thrown away. + +NOTE Reindenting + +00:21:16.920 --> 00:21:19.000 +Last up, a nice feature I think + +00:21:19.033 --> 00:21:20.933 +a lot of people will appreciate is, + +00:21:20.966 --> 00:21:24.300 +if you are familiar with... Let's open a text buffer. + +00:21:24.300 --> 00:21:30.279 +The M-q key is traditionally bound to fill-paragraph. + +00:21:30.280 --> 00:21:32.200 +What this means is that... + +00:21:32.233 --> 00:21:35.000 +Let's, for example, copy this text from here + +00:21:35.033 --> 00:21:40.366 +and squash it all into one line. If I press M-q here, + +00:21:40.400 --> 00:21:42.719 +then the lines will be broken + +00:21:42.720 --> 00:21:49.879 +according to the fill column indicator up here. + +00:21:49.880 --> 00:21:52.600 +This is the traditional usage of M-q, + +00:21:52.633 --> 00:21:54.200 +and it still works in text-mode buffers, + +00:21:54.233 --> 00:21:55.859 +but in prog-mode buffers-- + +00:21:55.860 --> 00:22:00.100 +so any major mode inheriting prog-mode-- + +00:22:00.100 --> 00:22:02.233 +M-q will now by default be bound + +00:22:02.266 --> 00:22:09.779 +to prog-fill-reindent-defun. To summarize the point, + +00:22:09.780 --> 00:22:13.433 +if you are editing a string or a comment, + +00:22:13.466 --> 00:22:16.039 +then the comment will be filled. + +00:22:16.040 --> 00:22:19.100 +But if you are outside of a comment or outside of a string, + +00:22:19.100 --> 00:22:23.166 +then the defun or the top-level construct + +00:22:23.200 --> 00:22:26.159 +in the programming language will be re-indented. + +00:22:26.160 --> 00:22:34.099 +Let's try that out with maybe some file I have open here. + +00:22:34.100 --> 00:22:38.800 +If I'm in this... Let's choose some function, + +00:22:38.833 --> 00:22:40.733 +let's take this for example. + +00:22:40.766 --> 00:22:43.959 +If we followed all of this again, + +00:22:43.960 --> 00:22:47.400 +and I press M-q in on this paragraph, + +00:22:47.433 --> 00:22:49.433 +then the paragraph gets re-indented. + +00:22:49.466 --> 00:22:55.800 +But if I'm down here and I choose to break the indentation + +00:22:55.833 --> 00:22:58.166 +and then press M-q, + +00:22:58.200 --> 00:23:02.333 +then as you see, it practically selected the defun + +00:23:02.366 --> 00:23:03.566 +and re-indented everything + +00:23:03.600 --> 00:23:06.959 +without having me to move the point around in the buffer. + +00:23:06.960 --> 00:23:08.633 +So I think that's a really nice feature, + +00:23:08.666 --> 00:23:11.100 +which a lot of people can appreciate. + +00:23:11.100 --> 00:23:17.939 +It's one of those niceties which comes from time to time. + +NOTE Wrapping up + +00:23:17.940 --> 00:23:20.633 +Right, so that was my overview + +00:23:20.666 --> 00:23:22.600 +of what's going to be new in Emacs 30. + +00:23:22.633 --> 00:23:24.400 +I hope that most people could take away + +00:23:24.433 --> 00:23:25.579 +something from this presentation + +00:23:25.580 --> 00:23:28.900 +and have something to look forward + +00:23:28.900 --> 00:23:31.133 +to try out after upgrading. + +00:23:31.166 --> 00:23:33.833 +As mentioned initially, as of recording, + +00:23:33.866 --> 00:23:36.566 +this release has not been completed yet. + +00:23:36.600 --> 00:23:38.833 +If this is still not the case + +00:23:38.866 --> 00:23:40.233 +when you're seeing this video, + +00:23:40.266 --> 00:23:43.833 +please consider downloading and building Emacs 30 yourself. + +00:23:43.866 --> 00:23:48.200 +If you have any issues, which is always the case, + +00:23:48.233 --> 00:23:56.439 +please report them to using report-emacs-bug. + +00:23:56.440 --> 00:23:57.907 +That will pop up a mail buffer, + +00:23:57.908 --> 00:23:59.600 +and then you can describe your issue and send them out. + +00:23:59.633 --> 00:24:01.800 +All bug reports are valuable, + +00:24:01.833 --> 00:24:04.433 +even if they are false positives or duplicates-- + +00:24:04.466 --> 00:24:05.233 +it doesn't matter-- + +00:24:05.266 --> 00:24:08.533 +because when you take the time to submit a bug report, + +00:24:08.566 --> 00:24:12.233 +which describes something that's specific to your setup, + +00:24:12.266 --> 00:24:16.700 +which the developers might not have noticed or known about, + +00:24:16.700 --> 00:24:19.133 +then you are certainly helping out a lot of other people + +00:24:19.166 --> 00:24:21.766 +which might run into the same issue in the future. + +00:24:21.800 --> 00:24:23.200 +Especially with upgrades, + +00:24:23.233 --> 00:24:26.566 +it would be nice to figure out small problems + +00:24:26.600 --> 00:24:30.800 +which make upgrading difficult for some people. + +00:24:30.833 --> 00:24:34.700 +The ideal is, of course, to have no issues + +00:24:34.700 --> 00:24:37.199 +when upgrading from one version to another. + +00:24:37.200 --> 00:24:39.566 +Having said that, I thank you for your attention, + +00:24:39.600 --> 00:24:43.766 +and I'm saying goodbye. diff --git a/2024/info/emacs30-after.md b/2024/info/emacs30-after.md index c854e4a5..449fadd2 100644 --- a/2024/info/emacs30-after.md +++ b/2024/info/emacs30-after.md @@ -1,6 +1,493 @@ <!-- Automatically generated by emacsconf-publish-after-page --> +<a name="emacs30-mainVideo-transcript"></a> +# Transcript + + +[[!template new="1" text="""Introduction""" start="00:00:00.000" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""Hello, and welcome to Emacs 30 Highlights at EmacsConf 2024.""" start="00:00:00.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Before I begin, I'd like to thank the organizers""" start="00:00:06.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and everyone involved for putting this all together.""" start="00:00:08.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""While this talk is being pre-recorded,""" start="00:00:11.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""my experience from the last few years""" start="00:00:13.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""assures me that it will be a great experience for everyone.""" start="00:00:15.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""My name is Philip Kaludercic.""" start="00:00:19.133" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I am a core contributor and ELPA co-maintainer.""" start="00:00:21.333" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I was honored when Sacha asked me""" start="00:00:24.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to take over the slot for this year.""" start="00:00:26.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""In the past few iterations,""" start="00:00:28.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""John Wiegley has filled a similar presentation""" start="00:00:29.900" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""focusing on more general Emacs development updates.""" start="00:00:32.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This year, I will specifically focus on""" start="00:00:35.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""highlight features from the upcoming Emacs 30 release,""" start="00:00:38.502" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which might or might not have been released""" start="00:00:41.933" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""by the time you are seeing this.""" start="00:00:44.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""As you can imagine, everything new about Emacs""" start="00:00:48.060" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""can always be found in the Emacs NEWS file.""" start="00:00:51.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Or, alternatively,""" start="00:00:55.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""if one doesn't want to read through the 3,000 lines here,""" start="00:00:57.133" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""one can also take a look at the Emacs FAQ""" start="00:01:01.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and then go to the what's new about""" start="00:01:05.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or what's different about Emacs 30 node.""" start="00:01:08.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Next to these two official options,""" start="00:01:12.333" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I also have a page on Emacs Wiki""" start="00:01:14.733" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""called EmacsThirtyHighlights,""" start="00:01:18.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""highlighting some of the interesting features""" start="00:01:21.333" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""with some context and suggestions on how to try them out.""" start="00:01:24.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This is more of a collaborative effort.""" start="00:01:28.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""So if you see this and think something is missing,""" start="00:01:30.066" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""feel free to add it.""" start="00:01:32.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""So without further ado,""" start="00:01:34.533" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""let's begin taking a look at new features in Emacs 30.""" start="00:01:36.866" video="mainVideo-emacs30" id="subtitle"]] + +[[!template new="1" text="""Android""" start="00:01:41.800" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""The biggest one, and the one I want to mention first,""" start="00:01:41.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""is Android support, native Android support.""" start="00:01:44.733" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""As you can see here, Emacs has been ported""" start="00:01:49.066" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to the Android operating system.""" start="00:01:51.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""What this means is that from Emacs 30 onwards,""" start="00:01:53.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""you can build Android to target Android devices natively""" start="00:01:56.533" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and using a graphical interface.""" start="00:02:01.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""While it has been possible to run Emacs""" start="00:02:06.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""inside of terminal emulators on Android for a while,""" start="00:02:08.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""this actually means that you can use Emacs""" start="00:02:11.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""on an Android device, a phone or a tablet,""" start="00:02:13.933" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and have all the usual advantages from GUI Emacs,""" start="00:02:17.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""such as the ability to bind all commands""" start="00:02:20.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""without having to worry about--""" start="00:02:23.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""all keys without having to worry""" start="00:02:25.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""about terminal compatibility issues,""" start="00:02:27.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""displaying images and multiple fonts""" start="00:02:29.066" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""on the same display of different sizes.""" start="00:02:32.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I should have a recording""" start="00:02:35.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""of that somewhere here--here we are--""" start="00:02:37.333" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which I made earlier on my phone,""" start="00:02:42.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""because I'm recording this on a laptop--""" start="00:02:44.133" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""where we can see how touch interaction works""" start="00:02:47.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""on an Android phone. I can switch between buffers.""" start="00:02:50.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Here I've connected an external keyboard,""" start="00:02:53.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""opening the Emacs website.""" start="00:02:56.133" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""We have images that we can interact with.""" start="00:02:57.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""We could resize them if we wanted to""" start="00:03:02.560" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""with the image resizing commands.""" start="00:03:04.320" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Pinch-to-zoom works, so it""" start="00:03:07.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""does realize what touchscreen interactions are.""" start="00:03:10.333" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""With an external mouse, and for example,""" start="00:03:12.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""enabling context menu mode,""" start="00:03:15.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I can even pop up little interaction windows,""" start="00:03:17.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which one you would usually also know from GUI Emacs.""" start="00:03:23.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""TUI Emacs actually also supports them since a while now.""" start="00:03:28.140" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""And in this case, I'm demonstrating""" start="00:03:33.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""how even the touchscreen events""" start="00:03:34.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""can be inspected using the usual help system,""" start="00:03:36.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and how context-mode notices""" start="00:03:39.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""where we are and allows me to, for example,""" start="00:03:43.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""evaluate this specific region,""" start="00:03:45.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which I've highlighted down there,""" start="00:03:47.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""binding a command to touch-screen-scroll. Yeah.""" start="00:03:49.333" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""One should note that these additions,""" start="00:03:58.333" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""for example touchscreen interaction,""" start="00:04:00.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""are not specific to Android,""" start="00:04:02.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""but they also are supported in other operating systems,""" start="00:04:03.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""such as Wayland and Xorg, which are not operating systems,""" start="00:04:07.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and Windows, insofar as they have touchscreen,""" start="00:04:12.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and devices have touchscreen support.""" start="00:04:15.333" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""One should mention, or I want to mention,""" start="00:04:18.420" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""that the main developer behind this feature, Po Lu,""" start="00:04:21.333" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""should be complimented for the additional effort he put""" start="00:04:24.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""into making sure that Emacs for Android""" start="00:04:27.533" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""can be built using only a free software toolchain,""" start="00:04:31.020" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which is certainly not something one has come to expect""" start="00:04:34.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""from working on Android applications,""" start="00:04:36.360" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""as usually you have to agree to some terms and conditions""" start="00:04:40.733" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""for Google-specific software.""" start="00:04:43.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Final note is that if you try and look for this online,""" start="00:04:46.520" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""there are APKs you can find,""" start="00:04:49.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""but some of them might be outdated.""" start="00:04:52.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""To the best of my knowledge, Po Lu has...""" start="00:04:54.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Emacs 30 Android Sourceforge...""" start="00:04:59.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""He has set up some system where here in Sourceforge,""" start="00:05:03.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""there are regular and updated""" start="00:05:06.533" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""APK files which you can download""" start="00:05:12.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to avoid having to build it yourself,""" start="00:05:14.533" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""testing out the newest version""" start="00:05:16.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""in case there are some bugs which you'd like to report.""" start="00:05:18.900" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Which-key is a package which has now been moved""" start="00:05:24.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""from ELPA to the core.""" start="00:05:33.133" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If you haven't heard of which-key before, the idea is,""" start="00:05:35.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or the general pitch is that which-key""" start="00:05:39.180" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""is a additional documentation interface for Emacs""" start="00:05:41.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""for displaying various keys which you could input,""" start="00:05:45.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or various keys and key maps""" start="00:05:49.733" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""that have been partially inputted.""" start="00:05:53.440" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""A better way to demonstrate this""" start="00:05:54.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or to explain this is just to show it.""" start="00:05:57.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If we enable the which-key mode--it's a global minor mode--""" start="00:05:59.333" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then I can press, for example, C-x,""" start="00:06:03.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which is a prefix for the C-x keymap.""" start="00:06:06.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Then down here in the buffer, in this window down here,""" start="00:06:08.733" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""we see various commands which we could invoke""" start="00:06:12.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and the keys to invoke them with.""" start="00:06:15.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""For example, if I wanted to say C-x i for insert-file,""" start="00:06:17.933" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then I just have to press i to highlight it once again.""" start="00:06:23.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It should be down here. Pressing i without having to repeat""" start="00:06:27.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""the entire key code again,""" start="00:06:32.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""the partial key code again, just works.""" start="00:06:34.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This is different from the feature which Emacs has already,""" start="00:06:37.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which is if you have input the partial keychord,""" start="00:06:41.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""you can press C-h""" start="00:06:45.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and then a help buffer pops up with a listing""" start="00:06:47.066" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""of all keybindings that start with C-x.""" start="00:06:51.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""The information is the same, the presentation is different,""" start="00:06:54.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""because now if I wanted to do C-x i,""" start="00:06:56.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I have to repeat the entire keychord again.""" start="00:06:59.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""So it's a matter of personal preference, which you prefer.""" start="00:07:03.340" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This is more of a traditional static approach""" start="00:07:09.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""because I get a help buffer which I can search""" start="00:07:10.960" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""using usual key commands,""" start="00:07:19.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""while which-key is more of a transient and modern.""" start="00:07:20.933" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Some might prefer that approach""" start="00:07:28.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to solving the same problem.""" start="00:07:31.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Also, don't forget to check out the customization group""" start="00:07:35.720" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""for which-key which has a number of options""" start="00:07:39.133" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which you might or might not be interested in.""" start="00:07:41.966" video="mainVideo-emacs30" id="subtitle"]] + +[[!template new="1" text="""EditorConfig""" start="00:07:45.720" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""Next up, Emacs 30 has built-in EditorConfig support.""" start="00:07:45.720" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If you have not heard of EditorConfig before,""" start="00:07:50.900" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I believe I've linked to it down here somewhere.""" start="00:07:53.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Ah, there it is, EditorConfig.""" start="00:07:56.640" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This is a file format used to specify""" start="00:08:00.120" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""common formatting rules in an editor-agnostic way.""" start="00:08:09.420" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""You might compare it to .dir-locals.el files,""" start="00:08:12.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which is a sort of an s-expression""" start="00:08:16.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""for setting file-local variables in Emacs.""" start="00:08:19.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Of course, this is restricted to the common subset""" start="00:08:22.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""of what all editors should understand.""" start="00:08:27.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""For example, indentation styles,""" start="00:08:29.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""whether you prefer tabs or spaces,""" start="00:08:31.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""tab width, file encoding, and so on.""" start="00:08:35.120" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""So it's nothing too advanced, but it's something...""" start="00:08:38.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It is a file format which one sees popping up more""" start="00:08:43.920" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and more often in lots of projects""" start="00:08:48.533" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which want to enforce a consistent indentation style""" start="00:08:50.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or formatting rules for all editors in a project.""" start="00:08:53.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Having this built in is certainly useful in Emacs.""" start="00:08:56.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Though one should note that it's not enabled by default.""" start="00:09:00.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""You still have to enable the global minor mode,""" start="00:09:03.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which is simply turning on this one option.""" start="00:09:10.940" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Shouldn't be more than that,""" start="00:09:14.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and then Emacs will respect the rules.""" start="00:09:15.533" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If it finds a .editorconfig file in the project directory,""" start="00:09:18.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then it will respect those rules""" start="00:09:23.641" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""without having to do anything else.""" start="00:09:25.321" video="mainVideo-emacs30" id="subtitle"]] + +[[!template new="1" text="""use-package integration with package-vc""" start="00:09:27.310" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""Next up, use-package integration with package-vc.""" start="00:09:27.310" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""For those not familiar with either of the two,""" start="00:09:33.568" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or at least one of the two,""" start="00:09:36.534" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""use-package is a popular configuration macro.""" start="00:09:37.534" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""What it does is it allows""" start="00:09:40.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""users to declaratively specify packages""" start="00:09:42.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""they would like to have installed and configured""" start="00:09:46.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""in their configuration file,""" start="00:09:48.900" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""so that, for example, if you copy your init.el""" start="00:09:51.660" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""from one system to another,""" start="00:09:54.433" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""it could bootstrap the entire configuration,""" start="00:09:55.900" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""downloading all the packages you want""" start="00:09:58.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""without having to manually do this""" start="00:10:00.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""on every system you'd like to use.""" start="00:10:02.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This allows configurations""" start="00:10:05.140" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to be self-encapsulated and portable.""" start="00:10:07.633" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""package-vc is an extension of package.el,""" start="00:10:10.860" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which allows installing packages from an alternative.""" start="00:10:15.060" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Instead of using the standard way to install packages,""" start="00:10:19.433" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which is just download tarball and unpack it,""" start="00:10:22.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""byte compile, and so on,""" start="00:10:26.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""it will fetch the files for a package""" start="00:10:27.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""directly from the source code repository""" start="00:10:32.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and initialize it in such a way""" start="00:10:35.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""that package.el can work with it.""" start="00:10:37.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""So it's just a front-end for installing packages.""" start="00:10:38.833" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Even though these two were added to Emacs 29,""" start="00:10:44.240" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""we didn't have the time to work on the""" start="00:10:46.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""use-package integration of package-vc into use-package,""" start="00:10:48.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which has been changed now.""" start="00:10:52.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""What we have with Emacs 30 is that""" start="00:10:54.633" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""there is a :vc keyword for use-package""" start="00:11:00.140" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""with which we can instruct use-package""" start="00:11:02.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to not download a package using tarball,""" start="00:11:05.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""but instead to fetch the source code""" start="00:11:10.240" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""from a source code repository.""" start="00:11:12.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This is useful if you, for example,""" start="00:11:13.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""have packages which you yourself work on""" start="00:11:15.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and know that you always want to have""" start="00:11:18.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""the development version of the package""" start="00:11:19.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""where you can directly commit changes you've made""" start="00:11:21.900" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to the repository and push them upstream.""" start="00:11:26.820" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Or, if you know that you want to contribute to a package,""" start="00:11:29.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""you can use package-vc to download the source code,""" start="00:11:32.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""have all the version control information,""" start="00:11:35.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""prepare a patch and send it upstream.""" start="00:11:37.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""In these examples here,""" start="00:11:41.740" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""the first example Lisp instructs package-vc""" start="00:11:43.833" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to download the source code from a URL.""" start="00:11:49.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""So this is a git URL where it will download""" start="00:11:52.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""the source code from, and in this case,""" start="00:11:55.433" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""choose the newest checkout of the source code,""" start="00:11:57.433" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""not the latest release. Down here, we have another example.""" start="00:12:00.033" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I prefer to consider the following example here.""" start="00:12:04.940" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If we just had written this,""" start="00:12:08.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then package-vc would use the metadata""" start="00:12:10.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which an ELPA server provides""" start="00:12:13.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to fetch the URL from the official repository of,""" start="00:12:15.033" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""in this case, BBDB, without having to...""" start="00:12:20.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It would be more or less the same like this up here,""" start="00:12:22.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""with the simple difference that package-vc integration""" start="00:12:27.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""into use-package doesn't check out the latest commit,""" start="00:12:32.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""but the latest release,""" start="00:12:36.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""just to keep configurations more deterministic by default.""" start="00:12:37.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Of course, if you prefer to use latest commit,""" start="00:12:44.980" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""you can use a package-vc install command""" start="00:12:47.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or just update the package manually yourself,""" start="00:12:52.180" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which you can use using package-vc-upgrade.""" start="00:12:54.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Next, I'd like to focus on a few features""" start="00:13:01.780" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which one might not necessarily realize directly,""" start="00:13:04.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""but will hopefully improve your experience with Emacs.""" start="00:13:07.033" video="mainVideo-emacs30" id="subtitle"]] + +[[!template new="1" text="""JSON""" start="00:13:11.560" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""First up in this list is a new JSON parser.""" start="00:13:11.560" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Let's maybe show the source code for that one:""" start="00:13:15.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""not json.el, json.c. The history of JSON parsing in Emacs""" start="00:13:21.960" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""started with Emacs 23 with the addition of json.el.""" start="00:13:39.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This was the file which we had just opened a moment ago.""" start="00:13:43.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This is a JSON parser in Emacs Lisp.""" start="00:13:46.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It's fine, it does the job, but it can get slow""" start="00:13:50.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""if we have a situation like where""" start="00:13:53.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Eglot uses a LSP server to communicate with""" start="00:13:55.033" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and the LSP server can get a bit chatty,""" start="00:14:00.320" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""sending a lot of JSON data,""" start="00:14:03.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which all has to be parsed and garbage collected,""" start="00:14:05.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which can slow down Emacs a bit.""" start="00:14:08.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""The situation was improved upon in Emacs 29""" start="00:14:09.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""when JSON parsing was added to the core.""" start="00:14:13.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This was the json.c file, which we see on this side,""" start="00:14:18.033" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""the old version of the json.c file,""" start="00:14:21.033" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which employed the Jansson library (it's the C library)""" start="00:14:22.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""for parsing and accelerating JSON parsing in Emacs.""" start="00:14:26.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This was good enough,""" start="00:14:31.900" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or it certainly improved the situation""" start="00:14:34.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""for a lot of LSP clients.""" start="00:14:36.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""But in Emacs 30, the situation has been improved once more""" start="00:14:38.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""with the addition of a JSON parser directly in Emacs.""" start="00:14:44.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""So instead of using an external library,""" start="00:14:49.833" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""there's a custom JSON parser written in C in the Emacs core,""" start="00:14:53.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which directly generates Elisp objects.""" start="00:14:57.433" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""The advantage to this approach""" start="00:15:01.540" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""compared to the Jansson approach""" start="00:15:05.066" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""is that there's no intermediate format""" start="00:15:06.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which has to be allocated""" start="00:15:07.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and memory managed and freed again,""" start="00:15:09.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which of course incurs an additional performance overhead.""" start="00:15:11.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Next to this, there's also a custom serializer""" start="00:15:19.540" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""for JSON contents translating a JSON object into a string.""" start="00:15:22.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""... The consequence of this is that""" start="00:15:29.240" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""there is absolutely no dependency on Jansson anymore.""" start="00:15:30.641" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This in turn means that now all Emacs users""" start="00:15:35.520" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""from Emacs 30 onwards""" start="00:15:38.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""can take advantage of this new JSON parser""" start="00:15:39.833" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and don't have to worry about whether""" start="00:15:42.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or not they have Jansson, this JSON parsing library,""" start="00:15:44.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""installed on their system or not when they want""" start="00:15:47.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to take advantage of this accelerated JSON parsing.""" start="00:15:50.466" video="mainVideo-emacs30" id="subtitle"]] + +[[!template new="1" text="""Native compilation""" start="00:15:56.680" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""Next up, another behind-the-scenes feature""" start="00:15:56.680" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""is that if you build Emacs on your own from source,""" start="00:16:00.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""you might know that if you wanted""" start="00:16:06.407" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to use native compilation,""" start="00:16:07.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""so the translation of Elisp bytecodes""" start="00:16:09.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to whatever the native assembly""" start="00:16:12.380" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or native instruction set is on your system,""" start="00:16:15.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""you have to specify with native compilation.""" start="00:16:19.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""when invoking the configure script,""" start="00:16:24.340" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""otherwise it would not have been enabled at all.""" start="00:16:25.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""With Emacs 30, this step is not necessary anymore.""" start="00:16:28.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""The configure script will automatically check""" start="00:16:32.480" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""if you have the libgccjit library installed on your system,""" start="00:16:36.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and if that is so,""" start="00:16:41.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then native compilation will be enabled by default.""" start="00:16:42.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""In other words, if you have an issue with native compilation""" start="00:16:45.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or prefer not to use it for whatever reason,""" start="00:16:49.433" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""you now have to type --without-native-compilation""" start="00:16:52.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""when compiling Emacs to prevent this from happening.""" start="00:16:55.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""But native compilation was added in Emacs 28""" start="00:16:58.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and has proven to be a very stable""" start="00:17:02.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and useful feature for most people,""" start="00:17:04.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""so there's probably no reason to do this""" start="00:17:06.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and you can just invoke the configure script""" start="00:17:09.433" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""with one argument less. Right, and I'd like to finish up""" start="00:17:11.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""with a few smaller features, a few smaller highlights.""" start="00:17:16.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Maybe we can go back to the listing here. Here we have it.""" start="00:17:19.500" video="mainVideo-emacs30" id="subtitle"]] + +[[!template new="1" text="""Tree-sitter""" start="00:17:29.640" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""There are a few new major modes""" start="00:17:29.640" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""based on the tree-sitter library.""" start="00:17:32.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""tree-sitter is this parser library""" start="00:17:34.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which has been integrated into Emacs 29.""" start="00:17:37.940" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It allows the integration""" start="00:17:39.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""of external, specialized, and quick parsers into Emacs,""" start="00:17:44.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which improve stuff like syntax highlighting, indentation,""" start="00:17:48.433" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""structural navigation, imenu support,""" start="00:17:52.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""by simply having a better understanding of, for example,""" start="00:17:55.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""a HTML file, or a Lua file, a PHP file,""" start="00:18:01.066" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""than what people usually implement""" start="00:18:03.900" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""using regular expressions in traditional major modes.""" start="00:18:06.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""So, a few new major modes which you can try out here.""" start="00:18:10.400" video="mainVideo-emacs30" id="subtitle"]] + +[[!template new="1" text="""Completion preview mode""" start="00:18:16.780" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""Another interesting feature is the completion-preview-mode.""" start="00:18:16.780" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""We can maybe try it out here in the scratch buffer.""" start="00:18:20.066" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If I enable completion-preview-mode...""" start="00:18:23.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This is a non-global minor mode,""" start="00:18:28.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which will display completion options inline using overlays.""" start="00:18:32.066" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""For example, if I start typing a longer symbol like define,""" start="00:18:38.633" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""now we have a derived mode. It suggests me to...""" start="00:18:43.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I can just press TAB and then it completes the option here,""" start="00:18:48.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""but it didn't actually...""" start="00:18:51.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It's not actually modifying the buffer, it's not pressing,""" start="00:18:51.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""these are just overlays,""" start="00:18:55.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""so if I move around, it gets deleted.""" start="00:18:57.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It wouldn't get saved if I were to save the buffer.""" start="00:18:59.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""The same also should work in a shell buffer.""" start="00:19:02.620" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If I enable completion preview mode here and start...""" start="00:19:05.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""In this case, I'm using the bash completion package,""" start="00:19:08.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which provides additional completion information.""" start="00:19:12.833" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This is not only limited to programming systems,""" start="00:19:15.033" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""but anywhere where you have completion at point in Emacs.""" start="00:19:17.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I can start typing here, ignore, and put ignore-backups,""" start="00:19:22.900" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and it hints to the options which I have""" start="00:19:26.160" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and allows me to complete them quickly.""" start="00:19:30.033" video="mainVideo-emacs30" id="subtitle"]] + +[[!template new="1" text="""package-isolate""" start="00:19:34.233" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""Another small feature is the package-isolate command.""" start="00:19:34.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""What this does is it will start""" start="00:19:38.000" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or it will prompt me for packages""" start="00:19:40.033" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I have installed in my system""" start="00:19:42.833" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and will start an isolated""" start="00:19:44.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or like "emacs -Q"-ish instance of emacs""" start="00:19:46.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""with only these packages installed.""" start="00:19:51.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""So for example, if I said I want slime and I want diff-hl,""" start="00:19:53.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then this is a new Emacs window.""" start="00:20:00.440" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It's unrelated to the one around.""" start="00:20:02.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It uses the same executable, of course,""" start="00:20:04.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""but will not load your configuration file""" start="00:20:06.500" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or any other further customizations on your system.""" start="00:20:09.940" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""All it does, it will ensure""" start="00:20:13.680" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""that these packages, which are listed here,""" start="00:20:15.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""so in our case SLIME and dependencies of SLIME and diff-hl,""" start="00:20:17.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""in the system""" start="00:20:24.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""so that I could, for example, as you can see here,""" start="00:20:25.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""diff-hl-mode works.""" start="00:20:29.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Okay, this is not a version-controlled file.""" start="00:20:32.140" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Maybe if we take a look at, have I enabled diff-hl-mode?""" start="00:20:34.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It's enabled in this case. What diff-hl-mode does""" start="00:20:41.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""is it displays these version control changes""" start="00:20:44.633" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""in the fringe of a buffer.""" start="00:20:48.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""And even though this is a uncustomized version of Emacs,""" start="00:20:49.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or an uncustomized instance of Emacs,""" start="00:20:54.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""it was easy for me to load this one package,""" start="00:20:56.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""or these two packages and all the dependencies necessary.""" start="00:20:59.033" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""As you can imagine, the main purpose for this""" start="00:21:02.066" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""is to make debugging issues easier.""" start="00:21:05.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If you want to report about an issue""" start="00:21:07.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""you have with a package. And if I close this, it's closed""" start="00:21:10.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and everything's thrown away.""" start="00:21:14.900" video="mainVideo-emacs30" id="subtitle"]] + +[[!template new="1" text="""Reindenting""" start="00:21:16.920" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""Last up, a nice feature I think""" start="00:21:16.920" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""a lot of people will appreciate is,""" start="00:21:19.033" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""if you are familiar with... Let's open a text buffer.""" start="00:21:20.966" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""The M-q key is traditionally bound to fill-paragraph.""" start="00:21:24.300" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""What this means is that...""" start="00:21:30.280" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Let's, for example, copy this text from here""" start="00:21:32.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and squash it all into one line. If I press M-q here,""" start="00:21:35.033" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then the lines will be broken""" start="00:21:40.400" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""according to the fill column indicator up here.""" start="00:21:42.720" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""This is the traditional usage of M-q,""" start="00:21:49.880" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and it still works in text-mode buffers,""" start="00:21:52.633" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""but in prog-mode buffers--""" start="00:21:54.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""so any major mode inheriting prog-mode--""" start="00:21:55.860" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""M-q will now by default be bound""" start="00:22:00.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to prog-fill-reindent-defun. To summarize the point,""" start="00:22:02.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""if you are editing a string or a comment,""" start="00:22:09.780" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then the comment will be filled.""" start="00:22:13.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""But if you are outside of a comment or outside of a string,""" start="00:22:16.040" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then the defun or the top-level construct""" start="00:22:19.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""in the programming language will be re-indented.""" start="00:22:23.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Let's try that out with maybe some file I have open here.""" start="00:22:26.160" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If I'm in this... Let's choose some function,""" start="00:22:34.100" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""let's take this for example.""" start="00:22:38.833" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If we followed all of this again,""" start="00:22:40.766" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and I press M-q in on this paragraph,""" start="00:22:43.960" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then the paragraph gets re-indented.""" start="00:22:47.433" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""But if I'm down here and I choose to break the indentation""" start="00:22:49.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and then press M-q,""" start="00:22:55.833" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then as you see, it practically selected the defun""" start="00:22:58.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and re-indented everything""" start="00:23:02.366" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""without having me to move the point around in the buffer.""" start="00:23:03.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""So I think that's a really nice feature,""" start="00:23:06.960" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which a lot of people can appreciate.""" start="00:23:08.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""It's one of those niceties which comes from time to time.""" start="00:23:11.100" video="mainVideo-emacs30" id="subtitle"]] + +[[!template new="1" text="""Wrapping up""" start="00:23:17.940" video="mainVideo-emacs30" id="subtitle"]] + +[[!template text="""Right, so that was my overview""" start="00:23:17.940" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""of what's going to be new in Emacs 30.""" start="00:23:20.666" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""I hope that most people could take away""" start="00:23:22.633" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""something from this presentation""" start="00:23:24.433" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and have something to look forward""" start="00:23:25.580" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""to try out after upgrading.""" start="00:23:28.900" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""As mentioned initially, as of recording,""" start="00:23:31.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""this release has not been completed yet.""" start="00:23:33.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If this is still not the case""" start="00:23:36.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""when you're seeing this video,""" start="00:23:38.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""please consider downloading and building Emacs 30 yourself.""" start="00:23:40.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""If you have any issues, which is always the case,""" start="00:23:43.866" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""please report them to using report-emacs-bug.""" start="00:23:48.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""That will pop up a mail buffer,""" start="00:23:56.440" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and then you can describe your issue and send them out.""" start="00:23:57.908" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""All bug reports are valuable,""" start="00:23:59.633" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""even if they are false positives or duplicates--""" start="00:24:01.833" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""it doesn't matter--""" start="00:24:04.466" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""because when you take the time to submit a bug report,""" start="00:24:05.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which describes something that's specific to your setup,""" start="00:24:08.566" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which the developers might not have noticed or known about,""" start="00:24:12.266" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""then you are certainly helping out a lot of other people""" start="00:24:16.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which might run into the same issue in the future.""" start="00:24:19.166" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Especially with upgrades,""" start="00:24:21.800" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""it would be nice to figure out small problems""" start="00:24:23.233" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""which make upgrading difficult for some people.""" start="00:24:26.600" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""The ideal is, of course, to have no issues""" start="00:24:30.833" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""when upgrading from one version to another.""" start="00:24:34.700" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""Having said that, I thank you for your attention,""" start="00:24:37.200" video="mainVideo-emacs30" id="subtitle"]] +[[!template text="""and I'm saying goodbye.""" start="00:24:39.600" video="mainVideo-emacs30" id="subtitle"]] + + + +Captioner: anush + Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202023%20emacs30%3A%20Emacs%2030%20Highlights) diff --git a/2024/info/emacs30-before.md b/2024/info/emacs30-before.md index 1551eb79..df636097 100644 --- a/2024/info/emacs30-before.md +++ b/2024/info/emacs30-before.md @@ -1,19 +1,32 @@ <!-- Automatically generated by emacsconf-publish-before-page --> The following image shows where the talk is in the schedule for Sat 2024-12-07. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="emacs30"> -<svg width="700" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="700" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2024/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(11,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2024/talks/papers" title="Writing academic papers in Org-Roam" data-slug="papers"> <title> 9:10- 9:20 Writing academic papers in Org-Roam</title> <rect x="13" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(24,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> papers</text></g></a> <a href="/2024/talks/project" title="Managing writing project metadata with org-mode" data-slug="project"> <title> 9:40-10:00 Managing writing project metadata with org-mode</title> <rect x="54" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(79,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> project</text></g></a> <a href="/2024/talks/org-update" title="The Future of Org" data-slug="org-update"> <title> 10:20-11:00 The Future of Org</title> <rect x="109" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(161,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-update</text></g></a> <a href="/2024/talks/color" title="Colour your Emacs with ease" data-slug="color"> <title> 11:20-11:30 Colour your Emacs with ease</title> <rect x="192" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(203,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> color</text></g></a> <a href="/2024/talks/theme" title="My journey of finding and creating the “perfect” Emacs theme" data-slug="theme"> <title> 1:00- 1:10 My journey of finding and creating the “perfect” Emacs theme</title> <rect x="329" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(340,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> theme</text></g></a> <a href="/2024/talks/water" title="Watering my (digital) plant with Emacs timers" data-slug="water"> <title> 1:30- 1:45 Watering my (digital) plant with Emacs timers</title> <rect x="370" y="15" opacity="0.5" width="20" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(388,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> water</text></g></a> <a href="/2024/talks/shell" title="Emacs as a shell" data-slug="shell"> <title> 1:55- 2:35 Emacs as a shell</title> <rect x="404" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(456,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> shell</text></g></a> <a href="/2024/talks/casual" title="Re-imagining the Emacs user experience with Casual Suite" data-slug="casual"> <title> 2:45- 3:05 Re-imagining the Emacs user experience with Casual Suite</title> <rect x="473" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(498,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> casual</text></g></a> <a href="/2024/talks/hyperdrive" title="New in hyperdrive.el: quick install, peer graph, transclusion!" data-slug="hyperdrive"> <title> 3:25- 3:45 New in hyperdrive.el: quick install, peer graph, transclusion!</title> <rect x="528" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(553,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperdrive</text></g></a> <a href="/2024/talks/writing" title="Emacs Writing Studio" data-slug="writing"> <title> 4:05- 4:15 Emacs Writing Studio</title> <rect x="583" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(594,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2024/talks/emacs30" title="Emacs 30 Highlights" data-slug="emacs30"> <title> 4:25- 4:50 Emacs 30 Highlights</title> <rect stroke-width="3" x="610" y="15" opacity="0.8" width="34" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(642,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> emacs30</text></g></a> <a href="/2024/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:00- 5:10 Saturday closing remarks</title> <rect x="658" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(669,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2024/talks/gypsum" title="Gypsum: my clone of Emacs and ELisp written in Scheme" data-slug="gypsum"> <title> 10:00-10:20 Gypsum: my clone of Emacs and ELisp written in Scheme</title> <rect x="82" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(107,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gypsum</text></g></a> <a href="/2024/talks/rust" title="An experimental Emacs core in Rust" data-slug="rust"> <title> 10:40-11:00 An experimental Emacs core in Rust</title> <rect x="137" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rust</text></g></a> <a href="/2024/talks/p-search" title="p-search: a local search engine in Emacs" data-slug="p-search"> <title> 11:20-11:45 p-search: a local search engine in Emacs</title> <rect x="192" y="75" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(224,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> p-search</text></g></a> <a href="/2024/talks/julia" title="Exploring shared philosophies in Julia and Emacs" data-slug="julia"> <title> 1:00- 1:10 Exploring shared philosophies in Julia and Emacs</title> <rect x="329" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(340,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> julia</text></g></a> <a href="/2024/talks/guile" title="Beguiling Emacs: Guile-Emacs relaunched!" data-slug="guile"> <title> 1:25- 1:45 Beguiling Emacs: Guile-Emacs relaunched!</title> <rect x="363" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(388,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> guile</text></g></a> <a href="/2024/talks/secrets" title="Committing secrets with git using sops-mode" data-slug="secrets"> <title> 1:55- 2:05 Committing secrets with git using sops-mode</title> <rect x="404" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(415,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> secrets</text></g></a> <a href="/2024/talks/mcclim" title="Elisp and McCLIM" data-slug="mcclim"> <title> 2:25- 3:25 Elisp and McCLIM</title> <rect x="446" y="75" opacity="0.5" width="82" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(526,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mcclim</text></g></a> <a href="/2024/talks/maxima" title="Emacs, eev, and Maxima - now!" data-slug="maxima"> <title> 3:45- 4:05 Emacs, eev, and Maxima - now!</title> <rect x="555" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(580,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maxima</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(82,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(164,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(247,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(329,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(411,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(494,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(576,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg> +<svg width="700" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="700" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2024/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(11,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2024/talks/papers" title="Writing academic papers in Org-Roam" data-slug="papers"> <title> 9:10- 9:20 Writing academic papers in Org-Roam</title> <rect x="13" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(24,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> papers</text></g></a> <a href="/2024/talks/project" title="Managing writing project metadata with org-mode" data-slug="project"> <title> 9:40-10:00 Managing writing project metadata with org-mode</title> <rect x="54" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(79,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> project</text></g></a> <a href="/2024/talks/org-update" title="The Future of Org" data-slug="org-update"> <title> 10:20-11:00 The Future of Org</title> <rect x="109" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(161,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-update</text></g></a> <a href="/2024/talks/color" title="Colour your Emacs with ease" data-slug="color"> <title> 11:20-11:30 Colour your Emacs with ease</title> <rect x="192" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(203,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> color</text></g></a> <a href="/2024/talks/theme" title="My journey of finding and creating the “perfect” Emacs theme" data-slug="theme"> <title> 1:00- 1:10 My journey of finding and creating the “perfect” Emacs theme</title> <rect x="329" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(340,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> theme</text></g></a> <a href="/2024/talks/water" title="Watering my (digital) plant with Emacs timers" data-slug="water"> <title> 1:30- 1:45 Watering my (digital) plant with Emacs timers</title> <rect x="370" y="15" opacity="0.5" width="20" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(388,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> water</text></g></a> <a href="/2024/talks/shell" title="Emacs as a shell" data-slug="shell"> <title> 1:55- 2:35 Emacs as a shell</title> <rect x="404" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(456,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> shell</text></g></a> <a href="/2024/talks/casual" title="Re-imagining the Emacs user experience with Casual Suite" data-slug="casual"> <title> 2:45- 3:05 Re-imagining the Emacs user experience with Casual Suite</title> <rect x="473" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(498,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> casual</text></g></a> <a href="/2024/talks/hyperdrive" title="New in hyperdrive.el: quick install, peer graph, transclusion!" data-slug="hyperdrive"> <title> 3:25- 3:45 New in hyperdrive.el: quick install, peer graph, transclusion!</title> <rect x="528" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(553,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperdrive</text></g></a> <a href="/2024/talks/writing" title="Emacs Writing Studio" data-slug="writing"> <title> 4:05- 4:15 Emacs Writing Studio</title> <rect x="583" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(594,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2024/talks/emacs30" title="Emacs 30 Highlights" data-slug="emacs30"> <title> 4:25- 4:50 Emacs 30 Highlights</title> <rect stroke-width="3" x="610" y="15" opacity="0.8" width="34" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(642,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> emacs30</text></g></a> <a href="/2024/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:00- 5:10 Saturday closing remarks</title> <rect x="658" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(669,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2024/talks/gypsum" title="Gypsum: my clone of Emacs and ELisp written in Scheme" data-slug="gypsum"> <title> 10:00-10:20 Gypsum: my clone of Emacs and ELisp written in Scheme</title> <rect x="82" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(107,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gypsum</text></g></a> <a href="/2024/talks/rust" title="An experimental Emacs core in Rust" data-slug="rust"> <title> 10:40-11:00 An experimental Emacs core in Rust</title> <rect x="137" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rust</text></g></a> <a href="/2024/talks/p-search" title="p-search: a local search engine in Emacs" data-slug="p-search"> <title> 11:20-11:45 p-search: a local search engine in Emacs</title> <rect x="192" y="75" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(224,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> p-search</text></g></a> <a href="/2024/talks/julia" title="Exploring shared philosophies in Julia and Emacs" data-slug="julia"> <title> 1:00- 1:10 Exploring shared philosophies in Julia and Emacs</title> <rect x="329" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(340,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> julia</text></g></a> <a href="/2024/talks/guile" title="Beguiling Emacs: Guile-Emacs relaunched!" data-slug="guile"> <title> 1:25- 1:45 Beguiling Emacs: Guile-Emacs relaunched!</title> <rect x="363" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(388,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> guile</text></g></a> <a href="/2024/talks/secrets" title="Committing secrets with git using sops-mode" data-slug="secrets"> <title> 1:55- 2:05 Committing secrets with git using sops-mode</title> <rect x="404" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(415,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> secrets</text></g></a> <a href="/2024/talks/mcclim" title="Elisp and McCLIM" data-slug="mcclim"> <title> 2:25- 3:25 Elisp and McCLIM</title> <rect x="446" y="75" opacity="0.5" width="82" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(526,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mcclim</text></g></a> <a href="/2024/talks/maxima" title="Emacs, eev, and Maxima - now!" data-slug="maxima"> <title> 3:45- 4:05 Emacs, eev, and Maxima - now!</title> <rect x="555" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(580,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maxima</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(82,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(164,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(247,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(329,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(411,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(494,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(576,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg> </div> [[!toc ]] Format: 25-min talk ; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2024/current/bbb-emacs30.html> Etherpad: <https://pad.emacsconf.org/2024-emacs30> Etherpad: <https://pad.emacsconf.org/2024-emacs30> Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen) -Status: Quality check +Status: Now playing on the conference livestream <div>Times in different time zones:</div><div class="times" start="2024-12-07T21:25:00Z" end="2024-12-07T21:50:00Z"><div class="conf-time">Saturday, Dec 7 2024, ~4:25 PM - 4:50 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 7 2024, ~3:25 PM - 3:50 PM CST (US/Central)<br />Saturday, Dec 7 2024, ~2:25 PM - 2:50 PM MST (US/Mountain)<br />Saturday, Dec 7 2024, ~1:25 PM - 1:50 PM PST (US/Pacific)<br />Saturday, Dec 7 2024, ~9:25 PM - 9:50 PM UTC <br />Saturday, Dec 7 2024, ~10:25 PM - 10:50 PM CET (Europe/Paris)<br />Saturday, Dec 7 2024, ~11:25 PM - 11:50 PM EET (Europe/Athens)<br />Sunday, Dec 8 2024, ~2:55 AM - 3:20 AM IST (Asia/Kolkata)<br />Sunday, Dec 8 2024, ~5:25 AM - 5:50 AM +08 (Asia/Singapore)<br />Sunday, Dec 8 2024, ~6:25 AM - 6:50 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2024/watch/gen/">Find out how to watch and participate</a></strong></div> +<div class="vid"><video controls preload="none" id="emacs30-mainVideo"><source src="https://media.emacsconf.org/2024/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2024/captions/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2024/captions/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="emacs30-mainVideo" data=""" +00:00.000 Introduction +01:41.800 Android +07:45.720 EditorConfig +09:27.310 use-package integration with package-vc +13:11.560 JSON +15:56.680 Native compilation +17:29.640 Tree-sitter +18:16.780 Completion preview mode +19:34.233 package-isolate +21:16.920 Reindenting +23:17.940 Wrapping up +"""]]<div></div>Duration: 24:55 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2024-emacs30">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2024/current/bbb-emacs30.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--edited.webm">Download --edited.webm (52MB)</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--main.webm">Download --main.webm (60MB)</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--notes.org">Download --notes.org</a></li></ul></div></div> # Description <!-- End of emacsconf-publish-before-page -->
\ No newline at end of file |