Transcript

[[!template new="1" text="""introduction""" start="00:00:00.000" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Hello, my name is Charles Choi and welcome to my talk:""" start="00:00:00.000" video="mainVideo-casual" id="subtitle"]] [[!template text=""""Reimagining the Emacs user experience with Casual Suite."""" start="00:00:05.080" video="mainVideo-casual" id="subtitle"]] [[!template text="""Casual Suite is a set of opinionated user interfaces to""" start="00:00:11.360" video="mainVideo-casual" id="subtitle"]] [[!template text="""different modes offered in Emacs. Before I get into""" start="00:00:14.920" video="mainVideo-casual" id="subtitle"]] [[!template text="""describing Casual in detail, let's first talk about the""" start="00:00:18.400" video="mainVideo-casual" id="subtitle"]] [[!template text="""existing Emacs user experience. To make Emacs go, people""" start="00:00:22.200" video="mainVideo-casual" id="subtitle"]] [[!template text="""can either invoke commands by name with""" start="00:00:27.040" video="mainVideo-casual" id="subtitle"]] [[!template text="""execute-extended-command,""" start="00:00:31.080" video="mainVideo-casual" id="subtitle"]] [[!template text="""run a command directly with a pre-assigned""" start="00:00:34.082" video="mainVideo-casual" id="subtitle"]] [[!template text="""key binding, finally, use a mouse menu if it's available.""" start="00:00:36.404" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Recall vs recognition""" start="00:00:43.800" video="mainVideo-casual" id="subtitle"]]
[[!template text="""From human-computer interface research, there is a""" start="00:00:43.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""concept of recall versus recognition in user interface""" start="00:00:46.720" video="mainVideo-casual" id="subtitle"]] [[!template text="""design. Let's show their distinction by example. A common""" start="00:00:50.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""recall interface is password entry. Absent any historical""" start="00:00:56.600" video="mainVideo-casual" id="subtitle"]] [[!template text="""affordances, a user must directly remember information to""" start="00:01:00.840" video="mainVideo-casual" id="subtitle"]] [[!template text="""succeed with this interface. In contrast, menus offer""" start="00:01:04.640" video="mainVideo-casual" id="subtitle"]] [[!template text="""immediate visual cues on what commands are available. This""" start="00:01:09.840" video="mainVideo-casual" id="subtitle"]] [[!template text="""allows a user to recognize familiar behavior to support""" start="00:01:13.440" video="mainVideo-casual" id="subtitle"]] [[!template text="""successful selection of it. From user interface research,""" start="00:01:16.840" video="mainVideo-casual" id="subtitle"]] [[!template text="""the key finding is this. Interfaces emphasizing""" start="00:01:21.880" video="mainVideo-casual" id="subtitle"]] [[!template text="""recognition are much easier to use than those relying on""" start="00:01:26.120" video="mainVideo-casual" id="subtitle"]] [[!template text="""recall. In this light, we see that the Emacs user experience""" start="00:01:30.000" video="mainVideo-casual" id="subtitle"]] [[!template text="""leans too much towards recall. Completion in history can""" start="00:01:35.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""help tip the scales towards recognition, but only by a""" start="00:01:41.280" video="mainVideo-casual" id="subtitle"]] [[!template text="""little bit.""" start="00:01:44.480" video="mainVideo-casual" id="subtitle"]] [[!template text="""This reliance on recall is discouraging to users both new""" start="00:01:47.960" video="mainVideo-casual" id="subtitle"]] [[!template text="""and old, and that's a shame because Emacs has so many useful""" start="00:01:52.400" video="mainVideo-casual" id="subtitle"]] [[!template text="""commands. But the kicker is that most of them are""" start="00:01:56.840" video="mainVideo-casual" id="subtitle"]] [[!template text="""infrequently used. You can't recall them all. At least I""" start="00:02:00.760" video="mainVideo-casual" id="subtitle"]] [[!template text="""can't. So, a conundrum. While I've been using Emacs since""" start="00:02:05.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""the early 90s, truthfully, it's been only in this past""" start="00:02:11.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""decade that I've leveled up in using it. Org Mode, Magit,""" start="00:02:15.160" video="mainVideo-casual" id="subtitle"]] [[!template text="""Eglot, Avy, and many other packages have transformed how I""" start="00:02:19.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""use it. I can only deal with so much cognitive load and""" start="00:02:23.200" video="mainVideo-casual" id="subtitle"]] [[!template text="""physically straining key bindings. So, what to do about it?""" start="00:02:28.640" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Emacs with keyboard-driven menus""" start="00:02:34.800" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Let's bring back an old ideal.""" start="00:02:34.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""Keyboard-driven menus have been around since TTY video""" start="00:02:36.160" video="mainVideo-casual" id="subtitle"]] [[!template text="""terminals with mainframes. If you're old enough to recall""" start="00:02:42.360" video="mainVideo-casual" id="subtitle"]] [[!template text="""working with such interfaces, these terms will seem""" start="00:02:47.360" video="mainVideo-casual" id="subtitle"]] [[!template text="""familiar. They all worked with the limitations of""" start="00:02:50.080" video="mainVideo-casual" id="subtitle"]] [[!template text="""text-based video displays.""" start="00:02:53.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""With keyboard-driven menus, if a command exists but nobody""" start="00:02:57.640" video="mainVideo-casual" id="subtitle"]] [[!template text="""can find it, it's not really useful. A well-designed menu""" start="00:03:01.600" video="mainVideo-casual" id="subtitle"]] [[!template text="""can make a command discoverable. If the command is""" start="00:03:05.520" video="mainVideo-casual" id="subtitle"]] [[!template text="""infrequently used, making it recognizable helps a lot. And""" start="00:03:09.720" video="mainVideo-casual" id="subtitle"]] [[!template text="""for working primarily with text, having keyboard-only""" start="00:03:15.200" video="mainVideo-casual" id="subtitle"]] [[!template text="""interactions encourages flow. Given the above, the next""" start="00:03:18.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""steps seem natural:""" start="00:03:24.120" video="mainVideo-casual" id="subtitle"]] [[!template text="""augment Emacs with keyboard-driven menus. This is not""" start="00:03:28.480" video="mainVideo-casual" id="subtitle"]] [[!template text="""saying that I want to obsolete name commands, keybindings,""" start="00:03:32.760" video="mainVideo-casual" id="subtitle"]] [[!template text="""and mouse menus. They all can happily coexist. Emacs is""" start="00:03:36.640" video="mainVideo-casual" id="subtitle"]] [[!template text="""large. It can contain multitudes.""" start="00:03:41.080" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Transient""" start="00:03:43.400" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Conveniently, Emacs has a built-in library for building""" start="00:03:43.400" video="mainVideo-casual" id="subtitle"]] [[!template text="""such menus. It's called Transient, and it's been around""" start="00:03:49.880" video="mainVideo-casual" id="subtitle"]] [[!template text="""since Emacs 28. Developed primarily by Jonas Bernoulli as a""" start="00:03:53.840" video="mainVideo-casual" id="subtitle"]] [[!template text="""UI toolkit for Magit, Transient has an essential feature""" start="00:03:59.320" video="mainVideo-casual" id="subtitle"]] [[!template text="""for building great keyboard-driven interfaces.""" start="00:04:03.200" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""A Transient menu can be pinned""" start="00:04:08.200" video="mainVideo-casual" id="subtitle"]]
[[!template text="""A transient menu can be pinned and their state updated as""" start="00:04:08.200" video="mainVideo-casual" id="subtitle"]] [[!template text="""commands are issued from them. This lets us build""" start="00:04:11.920" video="mainVideo-casual" id="subtitle"]] [[!template text="""interfaces that reflect internal state changes made by""" start="00:04:15.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""commands issued from the user. This is great because many""" start="00:04:18.400" video="mainVideo-casual" id="subtitle"]] [[!template text="""modes have stateful behavior, and guess what? Emacs has a lot""" start="00:04:21.920" video="mainVideo-casual" id="subtitle"]] [[!template text="""of modes.""" start="00:04:26.600" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Modes are apps, really""" start="00:04:29.303" video="mainVideo-casual" id="subtitle"]]
[[!template text="""If you think about it, Emacs modes are akin to the""" start="00:04:29.303" video="mainVideo-casual" id="subtitle"]] [[!template text="""ecosystem of apps that we see today, but with far less""" start="00:04:32.000" video="mainVideo-casual" id="subtitle"]] [[!template text="""structure and packaging. A mode, like an app, focuses on""" start="00:04:35.080" video="mainVideo-casual" id="subtitle"]] [[!template text="""delivering specific behavior to the user. There are many""" start="00:04:39.320" video="mainVideo-casual" id="subtitle"]] [[!template text="""built-in modes in Emacs, and these modes are complex with""" start="00:04:42.960" video="mainVideo-casual" id="subtitle"]] [[!template text="""dozens, if not hundreds, of commands. Calc itself has over""" start="00:04:46.000" video="mainVideo-casual" id="subtitle"]] [[!template text="""1,000 of them. It's frustrating to know that these commands""" start="00:04:50.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""are there, but I really can't access them via recall.""" start="00:04:54.880" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Transient all the modes!""" start="00:04:59.527" video="mainVideo-casual" id="subtitle"]]
[[!template text="""So I decided to do something about it, and that was to transient""" start="00:04:59.527" video="mainVideo-casual" id="subtitle"]] [[!template text="""all the modes, or at least the most major ones. This past""" start="00:05:05.080" video="mainVideo-casual" id="subtitle"]] [[!template text="""summer, I had the time and resources to start building""" start="00:05:10.000" video="mainVideo-casual" id="subtitle"]] [[!template text="""Transient interfaces for modes that I wanted to more""" start="00:05:12.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""elegantly use. I decided to call this work Casual. Given its""" start="00:05:15.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""definition, it seemed like a good fit for the vibe that I""" start="00:05:22.320" video="mainVideo-casual" id="subtitle"]] [[!template text="""wanted these interfaces to embody.""" start="00:05:25.520" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Casual design principles""" start="00:05:28.040" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Design principles that I embraced up front were""" start="00:05:28.040" video="mainVideo-casual" id="subtitle"]] [[!template text="""handcrafted information architecture and layout. This is""" start="00:05:35.000" video="mainVideo-casual" id="subtitle"]] [[!template text="""largely an exercise in mapping a mode's command set to a""" start="00:05:38.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""hierarchical menu structure. I wanted these menus to make""" start="00:05:41.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""sense to most people. Ideally, users would not have to read""" start="00:05:47.120" video="mainVideo-casual" id="subtitle"]] [[!template text="""documentation to get at the command that they wanted. Early""" start="00:05:50.720" video="mainVideo-casual" id="subtitle"]] [[!template text="""on, I quickly learned that it was impossible to maintain the""" start="00:05:55.840" video="mainVideo-casual" id="subtitle"]] [[!template text="""existing default key bindings when mapping them over to a""" start="00:05:59.360" video="mainVideo-casual" id="subtitle"]] [[!template text="""hierarchical menu. Also, some bindings I just flat out""" start="00:06:02.480" video="mainVideo-casual" id="subtitle"]] [[!template text="""disagreed with. I resolved to be friendly, but not""" start="00:06:06.760" video="mainVideo-casual" id="subtitle"]] [[!template text="""beholden to them. In all of the above, I've gone out of my way""" start="00:06:10.200" video="mainVideo-casual" id="subtitle"]] [[!template text="""to make clear that my design decisions are opinionated.""" start="00:06:14.920" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Casual design conventions""" start="00:06:17.960" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Using casual.""" start="00:06:17.960" video="mainVideo-casual" id="subtitle"]] [[!template text="""To reinforce habit, a common key binding is used per mode to""" start="00:06:21.720" video="mainVideo-casual" id="subtitle"]] [[!template text="""raise a main menu. This key binding is left to user""" start="00:06:30.040" video="mainVideo-casual" id="subtitle"]] [[!template text="""preference. For me, that binding is C-o.""" start="00:06:33.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""Command bindings are mnemonic when possible.""" start="00:06:36.720" video="mainVideo-casual" id="subtitle"]] [[!template text="""Mode-specific settings are given their own menu. Since""" start="00:06:44.640" video="mainVideo-casual" id="subtitle"]] [[!template text="""transient menus can be pinned, we can support repeat or""" start="00:06:49.560" video="mainVideo-casual" id="subtitle"]] [[!template text="""stateful behavior in a mode.""" start="00:06:53.320" video="mainVideo-casual" id="subtitle"]] [[!template text="""As of this writing, there are 11 modes supported by Casual,""" start="00:06:58.480" video="mainVideo-casual" id="subtitle"]] [[!template text="""with several more on the way.""" start="00:07:02.320" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Casual Dired""" start="00:07:04.366" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Let's look at the Casual menu""" start="00:07:04.366" video="mainVideo-casual" id="subtitle"]] [[!template text="""for Dired to highlight the design conventions previously""" start="00:07:05.720" video="mainVideo-casual" id="subtitle"]] [[!template text="""mentioned.""" start="00:07:12.480" video="mainVideo-casual" id="subtitle"]] [[!template text="""In a Dired Emacs window, the user can invoke their preferred""" start="00:07:13.560" video="mainVideo-casual" id="subtitle"]] [[!template text="""key binding to call a top-level Casual main menu. This main""" start="00:07:17.720" video="mainVideo-casual" id="subtitle"]] [[!template text="""menu is displayed at the bottom of the Emacs frame. Zooming""" start="00:07:22.280" video="mainVideo-casual" id="subtitle"]] [[!template text="""into this menu, we see the commands offered in it""" start="00:07:27.920" video="mainVideo-casual" id="subtitle"]] [[!template text="""categorized into different sections. Each command has a""" start="00:07:30.840" video="mainVideo-casual" id="subtitle"]] [[!template text="""key binding, usually a single character shown before its""" start="00:07:34.560" video="mainVideo-casual" id="subtitle"]] [[!template text="""label. The File section holds commands that act upon the""" start="00:07:38.040" video="mainVideo-casual" id="subtitle"]] [[!template text="""currently selected item or marked items. The Directory""" start="00:07:42.600" video="mainVideo-casual" id="subtitle"]] [[!template text="""section holds commands that affect the current directory""" start="00:07:47.560" video="mainVideo-casual" id="subtitle"]] [[!template text="""or its subdirs within it. The Mark section has marking""" start="00:07:50.320" video="mainVideo-casual" id="subtitle"]] [[!template text="""commands that allow for aggregate operations. The""" start="00:07:55.600" video="mainVideo-casual" id="subtitle"]] [[!template text="""Navigation section shows commands that move the point in a""" start="00:08:00.280" video="mainVideo-casual" id="subtitle"]] [[!template text="""direct buffer. The quick section provides access to""" start="00:08:03.400" video="mainVideo-casual" id="subtitle"]] [[!template text="""bookmark and buffer list commands. Search and replace""" start="00:08:09.560" video="mainVideo-casual" id="subtitle"]] [[!template text="""commands are grouped in the search section. New directory""" start="00:08:14.520" video="mainVideo-casual" id="subtitle"]] [[!template text="""and file creation are given their own section. Finally, at""" start="00:08:19.120" video="mainVideo-casual" id="subtitle"]] [[!template text="""the bottom of the menu are commands dedicated to Casual menu""" start="00:08:24.080" video="mainVideo-casual" id="subtitle"]] [[!template text="""navigation.""" start="00:08:27.600" video="mainVideo-casual" id="subtitle"]] [[!template text="""Casual is conformant to Transient conventions where the""" start="00:08:28.440" video="mainVideo-casual" id="subtitle"]] [[!template text="""key binding C-g for dismiss one and C-q to dismiss all""" start="00:08:34.080" video="mainVideo-casual" id="subtitle"]] [[!template text="""menus are honored. Another transient convention is to""" start="00:08:39.480" video="mainVideo-casual" id="subtitle"]] [[!template text="""reserve the key binding q to quit the current mode. For most""" start="00:08:43.640" video="mainVideo-casual" id="subtitle"]] [[!template text="""main menus, casual uses the , key binding to invoke a""" start="00:08:49.520" video="mainVideo-casual" id="subtitle"]] [[!template text="""mode-specific settings menu. Casual also adopts the""" start="00:08:53.960" video="mainVideo-casual" id="subtitle"]] [[!template text="""common UI convention of using ... >""" start="00:08:59.000" video="mainVideo-casual" id="subtitle"]] [[!template text="""symbols to denote required input and submenus""" start="00:09:02.040" video="mainVideo-casual" id="subtitle"]] [[!template text="""respectively.""" start="00:09:05.880" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Casual EditKit""" start="00:09:06.640" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Some commands are more global or non-mode specific in""" start="00:09:06.640" video="mainVideo-casual" id="subtitle"]] [[!template text="""nature. A great deal of these commands relate to editing,""" start="00:09:13.920" video="mainVideo-casual" id="subtitle"]] [[!template text="""which I find to be a prime motivation for using Emacs. Let's""" start="00:09:18.040" video="mainVideo-casual" id="subtitle"]] [[!template text="""examine one such menu that supports this.""" start="00:09:23.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""The main menu for Casual EditKit is designed to provide easy""" start="00:09:25.560" video="mainVideo-casual" id="subtitle"]] [[!template text="""access to editing and editing-related commands. Like the""" start="00:09:31.600" video="mainVideo-casual" id="subtitle"]] [[!template text="""previous Dired menu, it organizes commands into different""" start="00:09:36.280" video="mainVideo-casual" id="subtitle"]] [[!template text="""sections.""" start="00:09:39.960" video="mainVideo-casual" id="subtitle"]] [[!template text="""Commands related to file and buffer operations are in the""" start="00:09:40.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""File section. Commands for editing text are in the Edit""" start="00:09:46.000" video="mainVideo-casual" id="subtitle"]] [[!template text="""section. S- or balanced expression commands are given a""" start="00:09:50.520" video="mainVideo-casual" id="subtitle"]] [[!template text="""dedicated section for their own. More often than not, in""" start="00:09:55.600" video="mainVideo-casual" id="subtitle"]] [[!template text="""many modes, I find them to do what I want.""" start="00:09:59.440" video="mainVideo-casual" id="subtitle"]] [[!template text="""The tools section provides access to common tools.""" start="00:10:02.160" video="mainVideo-casual" id="subtitle"]] [[!template text="""Bookmarks I consider to be an essential feature. If you""" start="00:10:08.880" video="mainVideo-casual" id="subtitle"]] [[!template text="""haven't used them, it's never too late to start. Emacs""" start="00:10:13.720" video="mainVideo-casual" id="subtitle"]] [[!template text="""window management commands are given this section.""" start="00:10:18.440" video="mainVideo-casual" id="subtitle"]] [[!template text="""Commands for search and replace, macros, and projects can""" start="00:10:20.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""be accessed from here. Finally, the menu navigation""" start="00:10:25.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""section. Note that register commands can be accessed from""" start="00:10:32.200" video="mainVideo-casual" id="subtitle"]] [[!template text="""here.""" start="00:10:35.720" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""EditKit demo""" start="00:10:36.200" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Okay, enough screenshots. Let's look at Casual in action""" start="00:10:36.200" video="mainVideo-casual" id="subtitle"]] [[!template text="""with a demo of the EditKit menus. Let's start our demo of""" start="00:10:42.440" video="mainVideo-casual" id="subtitle"]] [[!template text="""casual-editkit with raising the menu, which is bound to""" start="00:10:48.440" video="mainVideo-casual" id="subtitle"]] [[!template text="""C-o. You'll see the menu pop up here. In""" start="00:10:54.440" video="mainVideo-casual" id="subtitle"]] [[!template text="""particular, we want to look at the edit operation. We'll""" start="00:10:58.920" video="mainVideo-casual" id="subtitle"]] [[!template text="""press e and we'll see a number of menu items that allow you to""" start="00:11:02.520" video="mainVideo-casual" id="subtitle"]] [[!template text="""make editing transformations to the text, be it marking,""" start="00:11:08.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""copying, killing, transposing, transforming, moving, or""" start="00:11:16.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""deleting the text. You'll see also that there is a submenu""" start="00:11:20.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""for rectangle operations. Let's first...""" start="00:11:24.280" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Marking and moving""" start="00:11:31.997" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Let's actually dig through and look at what's in the Mark submenu.""" start="00:11:31.997" video="mainVideo-casual" id="subtitle"]] [[!template text="""You'll see that there are increments of text in which you can""" start="00:11:37.407" video="mainVideo-casual" id="subtitle"]] [[!template text="""mark. You can mark a word, a sentence, a paragraph, and""" start="00:11:42.040" video="mainVideo-casual" id="subtitle"]] [[!template text="""balanced expression. If we go back, you'll see a similar""" start="00:11:45.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""pattern for copying as well as killing. Transposing.""" start="00:11:49.560" video="mainVideo-casual" id="subtitle"]] [[!template text="""Let's go and try to move a sentence. We have the point there at""" start="00:11:57.340" video="mainVideo-casual" id="subtitle"]] [[!template text="""hello there. We'll move that sentence around. If we""" start="00:12:02.880" video="mainVideo-casual" id="subtitle"]] [[!template text="""press s, we can move it backward or forward. In this case,""" start="00:12:07.120" video="mainVideo-casual" id="subtitle"]] [[!template text="""let's move it forward. We'll press f. You'll see hello""" start="00:12:12.120" video="mainVideo-casual" id="subtitle"]] [[!template text="""there move up a sentence. Then we can also press b to move""" start="00:12:16.280" video="mainVideo-casual" id="subtitle"]] [[!template text="""it back. Then press RET to dismiss. Also, if we wanted""" start="00:12:21.640" video="mainVideo-casual" id="subtitle"]] [[!template text="""to, we can... In this menu particularly, you'll see that we""" start="00:12:29.880" video="mainVideo-casual" id="subtitle"]] [[!template text="""also have cursor navigation, so we can move the point there.""" start="00:12:35.200" video="mainVideo-casual" id="subtitle"]] [[!template text="""That's not in all the menus, but in a good part number of the""" start="00:12:38.840" video="mainVideo-casual" id="subtitle"]] [[!template text="""menus in Casual Edit Kit, you'll see that here. Let's press""" start="00:12:43.040" video="mainVideo-casual" id="subtitle"]] [[!template text="""RET to dismiss that.""" start="00:12:47.920" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Rectangles""" start="00:12:53.140" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Let's actually look at some rectangle operations here.""" start="00:12:53.140" video="mainVideo-casual" id="subtitle"]] [[!template text="""In this case, we have a list with""" start="00:12:58.644" video="mainVideo-casual" id="subtitle"]] [[!template text="""items x, y, and z. Let's say we wanted to prefix each item""" start="00:13:01.760" video="mainVideo-casual" id="subtitle"]] [[!template text="""here with a string. We'll say we want to put in there""" start="00:13:08.520" video="mainVideo-casual" id="subtitle"]] [[!template text="""hello. One way of doing that is to make a rectangle. So""" start="00:13:14.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""if we go into our rectangle menu, first off, what we need to do""" start="00:13:21.160" video="mainVideo-casual" id="subtitle"]] [[!template text="""is define that rectangle region. We'll press m to mark""" start="00:13:25.720" video="mainVideo-casual" id="subtitle"]] [[!template text="""where the point is right there. Then we can use our cursor""" start="00:13:31.200" video="mainVideo-casual" id="subtitle"]] [[!template text="""operation to move the point to define the rectangle. In this""" start="00:13:35.440" video="mainVideo-casual" id="subtitle"]] [[!template text="""case, it's right at the start there. We can use the string""" start="00:13:39.560" video="mainVideo-casual" id="subtitle"]] [[!template text="""insert command, i, to insert hello, colon, and then we'll""" start="00:13:43.840" video="mainVideo-casual" id="subtitle"]] [[!template text="""put a space there to make it look a little nicer. Sure""" start="00:13:49.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""enough, that's in there.""" start="00:13:54.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""We can have access to a number of rectangle commands here.""" start="00:13:58.120" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Numbering""" start="00:14:04.976" video="mainVideo-casual" id="subtitle"]]
[[!template text="""If we wanted to, let's say, number, we can go through that same""" start="00:14:04.976" video="mainVideo-casual" id="subtitle"]] [[!template text="""operation here, define a region, a rectangle region that""" start="00:14:11.600" video="mainVideo-casual" id="subtitle"]] [[!template text="""is, and press n. You'll see that it has incremented a""" start="00:14:16.720" video="mainVideo-casual" id="subtitle"]] [[!template text="""number for each item in that rectangle region. We can also""" start="00:14:22.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""tap u to undo these operations""" start="00:14:28.640" video="mainVideo-casual" id="subtitle"]] [[!template text="""and leave that at that.""" start="00:14:32.469" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Sorting""" start="00:14:36.600" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Sorting. If we select a region here, And we go back. You'll""" start="00:14:36.600" video="mainVideo-casual" id="subtitle"]] [[!template text="""see that the sort submenu is now enabled. Sorting won't work""" start="00:14:47.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""unless you have a region started. That's one of the nice""" start="00:14:52.400" video="mainVideo-casual" id="subtitle"]] [[!template text="""things about transient is that it allows you to visually""" start="00:14:56.240" video="mainVideo-casual" id="subtitle"]] [[!template text="""enable or disable command items with regards to whatever""" start="00:15:01.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""the current state or context is here. In this case is""" start="00:15:09.080" video="mainVideo-casual" id="subtitle"]] [[!template text="""whether or not you have a region highlighted. Let's say we""" start="00:15:12.560" video="mainVideo-casual" id="subtitle"]] [[!template text="""want to sort these two columns of numbers and so there's a""" start="00:15:17.360" video="mainVideo-casual" id="subtitle"]] [[!template text="""command called n here which is numeric fields. Let's choose that""" start="00:15:22.880" video="mainVideo-casual" id="subtitle"]] [[!template text="""here. Sure enough we get that. But there's a nice twist""" start="00:15:29.760" video="mainVideo-casual" id="subtitle"]] [[!template text="""there. Let's say we wanted to sort on the second column.""" start="00:15:35.920" video="mainVideo-casual" id="subtitle"]] [[!template text="""Let's move our point back up to here and we'll mark that.""" start="00:15:39.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""Since everything is in a continuous line, we can sort of""" start="00:15:48.920" video="mainVideo-casual" id="subtitle"]] [[!template text="""pretend that this region is actually a paragraph""" start="00:15:52.800" video="mainVideo-casual" id="subtitle"]] [[!template text="""and mark that.""" start="00:15:55.949" video="mainVideo-casual" id="subtitle"]] [[!template text="""We'll go and select our sorting routine. But now we need to""" start="00:15:59.360" video="mainVideo-casual" id="subtitle"]] [[!template text="""figure out how to make numeric fields sort on the second""" start="00:16:07.000" video="mainVideo-casual" id="subtitle"]] [[!template text="""column. In transient, if we press a ?, that""" start="00:16:11.320" video="mainVideo-casual" id="subtitle"]] [[!template text="""gives us basically a intermediate help section where, if we""" start="00:16:16.360" video="mainVideo-casual" id="subtitle"]] [[!template text="""press a key binding, it will tell us or load the docstring for""" start="00:16:21.440" video="mainVideo-casual" id="subtitle"]] [[!template text="""the command that's there. That command in this case is""" start="00:16:27.280" video="mainVideo-casual" id="subtitle"]] [[!template text="""sort-numeric-fields. It requires an argument. That""" start="00:16:33.040" video="mainVideo-casual" id="subtitle"]] [[!template text="""argument can be passed using the prefix argument,""" start="00:16:40.040" video="mainVideo-casual" id="subtitle"]] [[!template text="""C-u. Press q. Let's do that. In this case, we""" start="00:16:44.080" video="mainVideo-casual" id="subtitle"]] [[!template text="""want to check or use the value 2 and press n. Sure enough,""" start="00:16:52.120" video="mainVideo-casual" id="subtitle"]] [[!template text="""that region is sorted with respect to the second column.""" start="00:16:58.680" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Casual has transformed my user experience with Emacs""" start="00:17:04.340" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Before Casual, so many powerful Emacs commands were not""" start="00:17:04.340" video="mainVideo-casual" id="subtitle"]] [[!template text="""available to me because they were too hard to recall or I""" start="00:17:12.160" video="mainVideo-casual" id="subtitle"]] [[!template text="""could not discover them. Making Casual has changed that,""" start="00:17:15.560" video="mainVideo-casual" id="subtitle"]] [[!template text="""letting me reimagine more positively my user experience""" start="00:17:19.880" video="mainVideo-casual" id="subtitle"]] [[!template text="""with Emacs. If you're interested in any of what I've shown""" start="00:17:24.360" video="mainVideo-casual" id="subtitle"]] [[!template text="""today, I invite you to try out Casual.""" start="00:17:29.200" video="mainVideo-casual" id="subtitle"]]
[[!template new="1" text="""Thanks and acknowledgements""" start="00:17:34.451" video="mainVideo-casual" id="subtitle"]]
[[!template text="""Before I leave, my thanks and acknowledgments""" start="00:17:34.451" video="mainVideo-casual" id="subtitle"]] [[!template text="""go out to the following people.""" start="00:17:37.033" video="mainVideo-casual" id="subtitle"]] [[!template text="""First, to Jonas Bernoulli for making Transient and Magit.""" start="00:17:38.680" video="mainVideo-casual" id="subtitle"]] [[!template text="""Casual would not be possible without your work. Next, to""" start="00:17:43.400" video="mainVideo-casual" id="subtitle"]] [[!template text="""Psionic-k for writing Transient Showcase. It showed me how I""" start="00:17:49.320" video="mainVideo-casual" id="subtitle"]] [[!template text="""could build casual. To all the casual users and their""" start="00:17:54.400" video="mainVideo-casual" id="subtitle"]] [[!template text="""support, I am genuinely appreciative. Finally, to Jon""" start="00:17:59.440" video="mainVideo-casual" id="subtitle"]] [[!template text="""Snader for writing the kind posts on Casual on the Irreal""" start="00:18:05.320" video="mainVideo-casual" id="subtitle"]] [[!template text="""website. Thank you.""" start="00:18:08.760" video="mainVideo-casual" id="subtitle"]] [[!template text="""Casual can be found on MELPA,""" start="00:18:10.520" video="mainVideo-casual" id="subtitle"]] [[!template text="""and its repository is hosted on GitHub.""" start="00:18:15.798" video="mainVideo-casual" id="subtitle"]]
Captioner: sachac

Q&A transcript (unedited)

[[!template new="1" text="""Opening""" start="00:00:00.000" video="qanda-casual" id="subtitle"]]
[[!template text="""Leo? I'm doing well as well and I'm so happy to have seen your""" start="00:00:00.000" video="qanda-casual" id="subtitle"]] [[!template text="""talk because the interaction with Emacs is always""" start="00:00:05.240" video="qanda-casual" id="subtitle"]] [[!template text="""something that I find very interesting, and stuff like""" start="00:00:10.720" video="qanda-casual" id="subtitle"]] [[!template text="""Transient, stuff like Hydra before, I think they really""" start="00:00:13.720" video="qanda-casual" id="subtitle"]] [[!template text="""improve the user experience of users, and I'm really glad""" start="00:00:18.840" video="qanda-casual" id="subtitle"]] [[!template text="""that I've seen you talk. Perhaps just starting with the""" start="00:00:22.120" video="qanda-casual" id="subtitle"]] [[!template text="""first question, do you have anything else that you'd like to""" start="00:00:24.480" video="qanda-casual" id="subtitle"]] [[!template text="""add on your talk? Because we are pretty stringent with the""" start="00:00:27.640" video="qanda-casual" id="subtitle"]] [[!template text="""amount of time that we give for talks, but is there anything""" start="00:00:30.720" video="qanda-casual" id="subtitle"]] [[!template text="""that you would have liked to mention to people that you""" start="00:00:33.200" video="qanda-casual" id="subtitle"]] [[!template text="""weren't able to fit into the talk? I think probably one of the""" start="00:00:35.640" video="qanda-casual" id="subtitle"]] [[!template text="""design considerations I've done is that many of the""" start="00:00:42.720" video="qanda-casual" id="subtitle"]] [[!template text="""commands that I've exposed through my casual interfaces""" start="00:00:46.600" video="qanda-casual" id="subtitle"]] [[!template text="""have been in Emacs. They've been in there forever, but very""" start="00:00:49.360" video="qanda-casual" id="subtitle"]] [[!template text="""few people uh, myself included really know that they're""" start="00:00:56.400" video="qanda-casual" id="subtitle"]] [[!template text="""there, uh, because they're just not discoverable through,""" start="00:01:00.440" video="qanda-casual" id="subtitle"]] [[!template text="""uh, basically the existing mechanisms, you know, prior to""" start="00:01:06.000" video="qanda-casual" id="subtitle"]] [[!template text="""transient and which key to, to even know that those, those""" start="00:01:09.560" video="qanda-casual" id="subtitle"]] [[!template text="""functions are there. Yeah. So I think I'm going to start""" start="00:01:13.480" video="qanda-casual" id="subtitle"]] [[!template text="""asking you questions whilst people start writing them in a""" start="00:01:19.400" video="qanda-casual" id="subtitle"]] [[!template text="""pad. But yeah, I also think that discoverability is a very""" start="00:01:21.520" video="qanda-casual" id="subtitle"]] [[!template text="""huge point that having stuff like the stuff that you've""" start="00:01:25.760" video="qanda-casual" id="subtitle"]] [[!template text="""showed today actually allows. One example that I'd like to""" start="00:01:29.560" video="qanda-casual" id="subtitle"]] [[!template text="""give that many people tend to forget, and you've already""" start="00:01:32.680" video="qanda-casual" id="subtitle"]] [[!template text="""mentioned it in your presentation, is that I've learned so""" start="00:01:35.760" video="qanda-casual" id="subtitle"]] [[!template text="""much about using git in general thanks to Magit, for the""" start="00:01:39.560" video="qanda-casual" id="subtitle"]] [[!template text="""reason that it shows you so many options that you might not be""" start="00:01:43.480" video="qanda-casual" id="subtitle"]] [[!template text="""aware of. For instance, I like to really think about when""" start="00:01:46.720" video="qanda-casual" id="subtitle"]] [[!template text="""you think about logging in git, Magit allows you to""" start="00:01:50.800" video="qanda-casual" id="subtitle"]] [[!template text="""discover so many of the finer options, like I only want to""" start="00:01:54.520" video="qanda-casual" id="subtitle"]] [[!template text="""see the first commit since the merge, or I only want to""" start="00:01:58.120" video="qanda-casual" id="subtitle"]] [[!template text="""consider this subsection of commits going from master or""" start="00:02:01.520" video="qanda-casual" id="subtitle"]] [[!template text="""main to the point of your branch. So many things like this""" start="00:02:06.000" video="qanda-casual" id="subtitle"]] [[!template text="""that you get to discover thanks to Transient. So do you have""" start="00:02:09.000" video="qanda-casual" id="subtitle"]] [[!template text="""any similar experience on your end? Oh yeah, far too""" start="00:02:11.760" video="qanda-casual" id="subtitle"]] [[!template text="""many, particularly with EditKit,""" start="00:02:16.880" video="qanda-casual" id="subtitle"]] [[!template text="""having access to these commands,""" start="00:02:22.360" video="qanda-casual" id="subtitle"]] [[!template text="""particularly with different granularity on""" start="00:02:28.280" video="qanda-casual" id="subtitle"]] [[!template text="""S-expressions, sentences, words...""" start="00:02:31.772" video="qanda-casual" id="subtitle"]] [[!template text="""Probably the most surprising thing I found""" start="00:02:34.774" video="qanda-casual" id="subtitle"]] [[!template text="""was just how how compelling the""" start="00:02:37.396" video="qanda-casual" id="subtitle"]] [[!template text="""S-expression would be as a unit of text for working with.""" start="00:02:43.022" video="qanda-casual" id="subtitle"]] [[!template text="""I found that in most contexts, or in many places,""" start="00:02:49.055" video="qanda-casual" id="subtitle"]] [[!template text="""it did what I wanted. I found that to be very surprising.""" start="00:02:53.989" video="qanda-casual" id="subtitle"]] [[!template text="""So unless you've got anything else to add, I think we can just""" start="00:03:02.720" video="qanda-casual" id="subtitle"]] [[!template text="""jump into questions. Okay, certainly. I'll be reading them""" start="00:03:06.160" video="qanda-casual" id="subtitle"]] [[!template text="""for you so that it's easier for you. So the first question is,""" start="00:03:10.640" video="qanda-casual" id="subtitle"]]
[[!template new="1" text="""Q: I wonder whether casual can only be used with the packages you""" start="00:03:13.600" video="qanda-casual" id="subtitle"]]
[[!template text="""I wonder whether casual can only be used with the packages""" start="00:03:13.600" video="qanda-casual" id="subtitle"]] [[!template text="""you mentioned or whether it can be used with whatever""" start="00:03:17.600" video="qanda-casual" id="subtitle"]] [[!template text="""packages you like. I think it's really the latter. I'm not""" start="00:03:19.600" video="qanda-casual" id="subtitle"]] [[!template text="""quite sure what the... What the question was really""" start="00:03:25.400" video="qanda-casual" id="subtitle"]] [[!template text="""pointing at, you know, is the question asking for why I chose""" start="00:03:29.880" video="qanda-casual" id="subtitle"]] [[!template text="""the packages or the different modes that I did? Or is it, are""" start="00:03:35.040" video="qanda-casual" id="subtitle"]] [[!template text="""they looking at it from a developer perspective of, can we""" start="00:03:41.680" video="qanda-casual" id="subtitle"]] [[!template text="""integrate casual with other packages? I mean, since we've""" start="00:03:45.520" video="qanda-casual" id="subtitle"]] [[!template text="""got a little bit of time ahead of us, feel free to answer both""" start="00:03:50.400" video="qanda-casual" id="subtitle"]] [[!template text="""questions. Um, I think the answer is, uh. Well, for the 1st,""" start="00:03:52.840" video="qanda-casual" id="subtitle"]] [[!template text="""1, I've, I've generally tried to stick with using. The modes""" start="00:03:59.280" video="qanda-casual" id="subtitle"]] [[!template text="""that are already packaged in, um, and so there was a. A big""" start="00:04:05.600" video="qanda-casual" id="subtitle"]] [[!template text="""refactoring of it where. Initially, I made separate repos""" start="00:04:11.040" video="qanda-casual" id="subtitle"]] [[!template text="""for the different modes that I supported. And then through a""" start="00:04:16.760" video="qanda-casual" id="subtitle"]] [[!template text="""discussion, which I won't go into here, that got changed""" start="00:04:20.880" video="qanda-casual" id="subtitle"]] [[!template text="""where I consolidated all of the different transient menus""" start="00:04:24.960" video="qanda-casual" id="subtitle"]] [[!template text="""for modes that are built in for behavior that's built into""" start="00:04:30.240" video="qanda-casual" id="subtitle"]] [[!template text="""the Emacs. I put that into a single package called casual.""" start="00:04:35.040" video="qanda-casual" id="subtitle"]] [[!template text="""And then integrations with other third party packages that""" start="00:04:39.200" video="qanda-casual" id="subtitle"]] [[!template text="""are not built in were given the same standalone repo here. In""" start="00:04:44.800" video="qanda-casual" id="subtitle"]] [[!template text="""terms of folks wanting to integrate that, it's the beauty of""" start="00:04:49.880" video="qanda-casual" id="subtitle"]] [[!template text="""open source. They can get the repo and uh, and basically""" start="00:04:55.720" video="qanda-casual" id="subtitle"]] [[!template text="""study that the code base, uh, actually, if they even install""" start="00:05:01.160" video="qanda-casual" id="subtitle"]] [[!template text="""it through, uh, you know, the package manager in this case,""" start="00:05:05.200" video="qanda-casual" id="subtitle"]] [[!template text="""uh, coming from the Melbourne distribution, um, they can""" start="00:05:08.600" video="qanda-casual" id="subtitle"]] [[!template text="""inspect that code and, and, um, make modifications or even.""" start="00:05:12.680" video="qanda-casual" id="subtitle"]] [[!template text="""uh, you know, integrate that with their other packages and,""" start="00:05:17.920" video="qanda-casual" id="subtitle"]] [[!template text="""uh, do that to their heart's content. Um, I think one of the""" start="00:05:21.520" video="qanda-casual" id="subtitle"]] [[!template text="""things that I need to, or at least, uh, you know, that I, I, I""" start="00:05:25.280" video="qanda-casual" id="subtitle"]] [[!template text="""planned on sort of elaborating further on in the""" start="00:05:29.640" video="qanda-casual" id="subtitle"]] [[!template text="""documentation is, is that transient already has built in""" start="00:05:32.520" video="qanda-casual" id="subtitle"]] [[!template text="""mechanisms for modifying an existing transient. So you can""" start="00:05:36.400" video="qanda-casual" id="subtitle"]] [[!template text="""add commands or, uh, re redefine the bindings. And so. That""" start="00:05:41.280" video="qanda-casual" id="subtitle"]] [[!template text="""mechanism is available for users if they're not happy with""" start="00:05:47.280" video="qanda-casual" id="subtitle"]] [[!template text="""those bindings or they want to add their own commands to a""" start="00:05:51.960" video="qanda-casual" id="subtitle"]] [[!template text="""menu. Yeah, and people are... I'm personally familiar with""" start="00:05:57.160" video="qanda-casual" id="subtitle"]] [[!template text="""this, again, with Magit, because sometimes, even though""" start="00:06:01.960" video="qanda-casual" id="subtitle"]] [[!template text="""you have a lot of discoverability for functions that you may""" start="00:06:05.120" video="qanda-casual" id="subtitle"]] [[!template text="""not know, sometimes you also happen to realize that""" start="00:06:07.480" video="qanda-casual" id="subtitle"]] [[!template text="""something is missing in the list of available options. I'm""" start="00:06:10.360" video="qanda-casual" id="subtitle"]] [[!template text="""not sure if Casual actually supports something similar to""" start="00:06:14.000" video="qanda-casual" id="subtitle"]] [[!template text="""Magit, which is levels of options being displayed.""" start="00:06:16.920" video="qanda-casual" id="subtitle"]] [[!template text="""Actually, I'm not sure if it's transient native or if it's""" start="00:06:21.560" video="qanda-casual" id="subtitle"]] [[!template text="""just something that Magit adds over this. No, transient""" start="00:06:24.040" video="qanda-casual" id="subtitle"]] [[!template text="""supports levels. I've decided""" start="00:06:27.440" video="qanda-casual" id="subtitle"]] [[!template text="""in large part, I've tried to avoid that just to avoid the""" start="00:06:30.600" video="qanda-casual" id="subtitle"]] [[!template text="""added complexity of trying to define those levels. Yeah, I""" start="00:06:36.800" video="qanda-casual" id="subtitle"]] [[!template text="""was going to say that perhaps it doesn't gel very well with""" start="00:06:43.120" video="qanda-casual" id="subtitle"]] [[!template text="""the notion of casualness that you seem to be introducing the""" start="00:06:47.480" video="qanda-casual" id="subtitle"]] [[!template text="""package. On one end, you've got something that is supposed""" start="00:06:49.840" video="qanda-casual" id="subtitle"]] [[!template text="""to be very casual, very easy to use, and on the other end, you""" start="00:06:52.440" video="qanda-casual" id="subtitle"]] [[!template text="""add levels for stuff that is fairly advanced. So advanced""" start="00:06:56.640" video="qanda-casual" id="subtitle"]] [[!template text="""versus casual, kind of makes sense that you check this over.""" start="00:06:59.600" video="qanda-casual" id="subtitle"]] [[!template text="""Alright, moving to the second question which is related to""" start="00:07:05.760" video="qanda-casual" id="subtitle"]] [[!template text="""the previous one.""" start="00:07:09.360" video="qanda-casual" id="subtitle"]]
[[!template new="1" text="""Q: Are there any patterns emerging, such that it would seem possible to 1) systematize 2) automate(?) the mapping of mode commands to keyboard-driven menus? Possibly even have an auto casual wrapper for an uncovered mode?""" start="00:07:10.854" video="qanda-casual" id="subtitle"]]
[[!template text="""Are there any patterns emerging such that""" start="00:07:10.854" video="qanda-casual" id="subtitle"]] [[!template text="""it would be impossible, sorry, such that it would be""" start="00:07:13.160" video="qanda-casual" id="subtitle"]] [[!template text="""possible to once systematize and to automate the mapping of""" start="00:07:15.640" video="qanda-casual" id="subtitle"]] [[!template text="""mode commands to keyboard-driven menus, possibly even""" start="00:07:19.720" video="qanda-casual" id="subtitle"]] [[!template text="""have an auto-casual wrapper for an uncovered mode? Does it""" start="00:07:23.520" video="qanda-casual" id="subtitle"]] [[!template text="""make sense to you? Yes, and I've gotten these comments from a""" start="00:07:26.560" video="qanda-casual" id="subtitle"]] [[!template text="""number of different folks who really want to see some sort""" start="00:07:35.520" video="qanda-casual" id="subtitle"]] [[!template text="""of design rule to, or basically, what is it? Some sort of""" start="00:07:42.800" video="qanda-casual" id="subtitle"]] [[!template text="""design system to be able to generate the UI.""" start="00:07:49.640" video="qanda-casual" id="subtitle"]] [[!template text="""Conceptually, I think it's doable, but on the flip side, it""" start="00:07:54.680" video="qanda-casual" id="subtitle"]] [[!template text="""just requires so much coordination that it makes it really""" start="00:08:01.400" video="qanda-casual" id="subtitle"]] [[!template text="""untenable. In this case, I have very strong opinions. I""" start="00:08:05.320" video="qanda-casual" id="subtitle"]] [[!template text="""think we're better off trying to handcraft the user""" start="00:08:11.200" video="qanda-casual" id="subtitle"]] [[!template text="""interface to get basically the best user experience. To try""" start="00:08:15.720" video="qanda-casual" id="subtitle"]] [[!template text="""to emulate that with a design system, good luck, but I'm not""" start="00:08:20.760" video="qanda-casual" id="subtitle"]] [[!template text="""I'm not interested in working on that. Right, yeah. I think""" start="00:08:26.400" video="qanda-casual" id="subtitle"]] [[!template text="""if I try to think a little more about this, it feels like""" start="00:08:31.520" video="qanda-casual" id="subtitle"]] [[!template text="""there's a notion of intention that is very important when""" start="00:08:34.120" video="qanda-casual" id="subtitle"]] [[!template text="""you are designing UI and UX. And to have this intention, it""" start="00:08:36.560" video="qanda-casual" id="subtitle"]] [[!template text="""feels like you cannot just base yourself of a design idea to""" start="00:08:41.480" video="qanda-casual" id="subtitle"]] [[!template text="""organize the options. You cannot just work off a pattern. I""" start="00:08:45.320" video="qanda-casual" id="subtitle"]] [[!template text="""think you need to have the trace of human understanding in""" start="00:08:48.800" video="qanda-casual" id="subtitle"]] [[!template text="""order to have a UX that really works. And judging by the""" start="00:08:53.600" video="qanda-casual" id="subtitle"]] [[!template text="""option that you've picked in the demos that you've showed""" start="00:08:56.680" video="qanda-casual" id="subtitle"]] [[!template text="""today, I don't think it'd be particularly easy to organize""" start="00:08:59.000" video="qanda-casual" id="subtitle"]] [[!template text="""them in a UX just casually for any mode. I think you need some""" start="00:09:04.040" video="qanda-casual" id="subtitle"]] [[!template text="""human introspection to understand this, if that makes""" start="00:09:07.960" video="qanda-casual" id="subtitle"]] [[!template text="""sense.""" start="00:09:14.160" video="qanda-casual" id="subtitle"]] [[!template text="""Moving to the next question, which is related to something""" start="00:09:14.680" video="qanda-casual" id="subtitle"]] [[!template text="""we discussed about with Magit.""" start="00:09:17.280" video="qanda-casual" id="subtitle"]]
[[!template new="1" text="""Q: Does Casual have a log where you can see what commands were invoked?""" start="00:09:19.606" video="qanda-casual" id="subtitle"]]
[[!template text="""Does Casual have a log where""" start="00:09:19.606" video="qanda-casual" id="subtitle"]] [[!template text="""you can see what commands were invoked? This is always""" start="00:09:21.080" video="qanda-casual" id="subtitle"]] [[!template text="""available via M-x view-lossage or via the command-log-mode,""" start="00:09:23.760" video="qanda-casual" id="subtitle"]] [[!template text="""but I'm wondering if it can do for Emacs command what""" start="00:09:27.480" video="qanda-casual" id="subtitle"]] [[!template text="""magit-process-buffer does for learning Git commands. And for""" start="00:09:30.994" video="qanda-casual" id="subtitle"]] [[!template text="""everyone who's currently in Emacs, whenever you're""" start="00:09:34.480" video="qanda-casual" id="subtitle"]] [[!template text="""running a command in Magit, it's always printing the exact""" start="00:09:37.440" video="qanda-casual" id="subtitle"]] [[!template text="""command that was run in a shell, inside this $""" start="00:09:40.640" video="qanda-casual" id="subtitle"]] [[!template text="""menu. So does Casual actually provide something similar,""" start="00:09:44.800" video="qanda-casual" id="subtitle"]] [[!template text="""Charles? I don't know. In general, because I'm building off""" start="00:09:47.400" video="qanda-casual" id="subtitle"]] [[!template text="""of transient, it would have to be a mechanism that's""" start="00:09:52.600" video="qanda-casual" id="subtitle"]] [[!template text="""available through transient. And You know, I would let""" start="00:09:55.200" video="qanda-casual" id="subtitle"]] [[!template text="""Jonas speak more on that capability, because to be honest, I""" start="00:10:01.520" video="qanda-casual" id="subtitle"]] [[!template text="""mean, even to my knowledge of transient is not that deep,""" start="00:10:06.800" video="qanda-casual" id="subtitle"]] [[!template text="""actually.""" start="00:10:14.880" video="qanda-casual" id="subtitle"]] [[!template text="""Well, it's funny that you say this because even though you""" start="00:10:16.840" video="qanda-casual" id="subtitle"]] [[!template text="""say your knowledge might not be that big, you still managed""" start="00:10:21.400" video="qanda-casual" id="subtitle"]] [[!template text="""to develop a whole suite of tools on top of it. So as far as""" start="00:10:23.760" video="qanda-casual" id="subtitle"]] [[!template text="""people who do not know transient a whole lot, you're doing a""" start="00:10:27.240" video="qanda-casual" id="subtitle"]] [[!template text="""pretty damn good job. Let me tell you that much. Thank you.""" start="00:10:29.600" video="qanda-casual" id="subtitle"]] [[!template text="""Yeah, I think sort of what I bring to the table is, you know,""" start="00:10:33.160" video="qanda-casual" id="subtitle"]] [[!template text="""quite a considerable career in software development on""" start="00:10:37.720" video="qanda-casual" id="subtitle"]] [[!template text="""other software ecosystems. And as of late, I've spent""" start="00:10:41.920" video="qanda-casual" id="subtitle"]] [[!template text="""basically the past decade working on iOS apps. Right. I""" start="00:10:47.880" video="qanda-casual" id="subtitle"]] [[!template text="""think it's refreshing to be able to go back to something that""" start="00:10:52.440" video="qanda-casual" id="subtitle"]] [[!template text="""looks like Emacs after iOS.""" start="00:10:55.200" video="qanda-casual" id="subtitle"]] [[!template text="""Well, that's perhaps another longer conversation there.""" start="00:10:56.840" video="qanda-casual" id="subtitle"]] [[!template text="""Speaking of longer conversation, we have only about 10""" start="00:11:03.880" video="qanda-casual" id="subtitle"]] [[!template text="""minutes left until we need to move on to the next talk. But""" start="00:11:08.600" video="qanda-casual" id="subtitle"]] [[!template text="""thank you everyone for all the questions you're asking. I'm""" start="00:11:11.600" video="qanda-casual" id="subtitle"]] [[!template text="""not saying this because we finished, but it's good to see so""" start="00:11:13.760" video="qanda-casual" id="subtitle"]] [[!template text="""many people writing in the chat and asking questions. It""" start="00:11:17.240" video="qanda-casual" id="subtitle"]] [[!template text="""always shows that you're interested and that's always""" start="00:11:19.920" video="qanda-casual" id="subtitle"]] [[!template text="""lovely to us. And you've mentioned Jonas. Obviously, we're""" start="00:11:23.080" video="qanda-casual" id="subtitle"]] [[!template text="""talking about Jonas Bernoulli, i.e. Tarsius, the""" start="00:11:26.080" video="qanda-casual" id="subtitle"]] [[!template text="""maintainer of transient. And what Charles just mentioned""" start="00:11:29.360" video="qanda-casual" id="subtitle"]] [[!template text="""about having a transient tooling to print the lossage,""" start="00:11:33.440" video="qanda-casual" id="subtitle"]] [[!template text="""basically, of which sex were run by which command, feels""" start="00:11:37.560" video="qanda-casual" id="subtitle"]] [[!template text="""like this is something that would be interesting. So,""" start="00:11:43.040" video="qanda-casual" id="subtitle"]] [[!template text="""perhaps, I'm not sure if Tarsius is still on the chat""" start="00:11:44.840" video="qanda-casual" id="subtitle"]] [[!template text="""currently, but he was definitely around earlier today, so""" start="00:11:50.240" video="qanda-casual" id="subtitle"]] [[!template text="""we'll make sure that the ID lands on his lap later on. All""" start="00:11:52.640" video="qanda-casual" id="subtitle"]] [[!template text="""right, moving to the next question.""" start="00:11:55.840" video="qanda-casual" id="subtitle"]]
[[!template new="1" text="""Q: Is there a setting to close menu after executing command?""" start="00:12:00.204" video="qanda-casual" id="subtitle"]]
[[!template text="""Is there a setting to""" start="00:12:00.204" video="qanda-casual" id="subtitle"]] [[!template text="""close menu after executing a command? By default, it will.""" start="00:12:00.920" video="qanda-casual" id="subtitle"]] [[!template text="""There's a slot that you can define in a transient""" start="00:12:07.480" video="qanda-casual" id="subtitle"]] [[!template text="""prefix called :transient. And if you set that to true,""" start="00:12:10.880" video="qanda-casual" id="subtitle"]] [[!template text="""then it will persist the menu after executing the command.""" start="00:12:17.200" video="qanda-casual" id="subtitle"]] [[!template text="""But by default, it will actually dismiss the menu. This""" start="00:12:20.640" video="qanda-casual" id="subtitle"]] [[!template text="""feels... Did you actually get to play with Hydra before""" start="00:12:26.160" video="qanda-casual" id="subtitle"]] [[!template text="""playing with transients? To be honest, no. Yeah, I kind of""" start="00:12:29.360" video="qanda-casual" id="subtitle"]] [[!template text="""slept on Hydra or at least, you know, I really wasn't all that""" start="00:12:36.280" video="qanda-casual" id="subtitle"]] [[!template text="""ambitious with working with different packages until""" start="00:12:41.720" video="qanda-casual" id="subtitle"]] [[!template text="""about like, a little less than 2 years ago or so.""" start="00:12:44.640" video="qanda-casual" id="subtitle"]] [[!template text="""And then the other part was also, um. You know, not not really""" start="00:12:48.640" video="qanda-casual" id="subtitle"]] [[!template text="""a technical. Start a comparison because I really don't want""" start="00:12:57.640" video="qanda-casual" id="subtitle"]] [[!template text="""to upset folks here, but, uh. But more along the lines of just""" start="00:13:02.000" video="qanda-casual" id="subtitle"]] [[!template text="""going with the notion that transient was being built in or""" start="00:13:05.760" video="qanda-casual" id="subtitle"]] [[!template text="""packaged as a built in package for Emacs. I went with using""" start="00:13:09.560" video="qanda-casual" id="subtitle"]] [[!template text="""that for my implementation. Cool. And I don't think there's""" start="00:13:15.280" video="qanda-casual" id="subtitle"]] [[!template text="""anything controversial with what you're saying right now""" start="00:13:20.680" video="qanda-casual" id="subtitle"]] [[!template text="""because, you know, we had earlier today, Euro Rechenko, the""" start="00:13:23.200" video="qanda-casual" id="subtitle"]] [[!template text="""new maintainer of Augment, mentioning that he'd like to""" start="00:13:28.840" video="qanda-casual" id="subtitle"]] [[!template text="""have a better integration with Transient because""" start="00:13:32.440" video="qanda-casual" id="subtitle"]] [[!template text="""Transient is, it looks like it's here to stay for a long time""" start="00:13:34.320" video="qanda-casual" id="subtitle"]] [[!template text="""and might even land in core at some point. So, it definitely""" start="00:13:39.160" video="qanda-casual" id="subtitle"]] [[!template text="""feels comparing Hydra because for me, most of my UI needs in""" start="00:13:42.880" video="qanda-casual" id="subtitle"]] [[!template text="""Emacs prior to Transient were done via Hydra because it was a""" start="00:13:49.520" video="qanda-casual" id="subtitle"]] [[!template text="""very convenient tooling. For people who do not know, Hydra""" start="00:13:54.440" video="qanda-casual" id="subtitle"]] [[!template text="""is written by AboAbo. who's also authored packages like""" start="00:13:57.800" video="qanda-casual" id="subtitle"]] [[!template text="""Lispy, an interactive Lisp mode, also for Ivy, which you""" start="00:14:02.920" video="qanda-casual" id="subtitle"]] [[!template text="""might know as the counterpart of Helm, maybe five years ago.""" start="00:14:08.640" video="qanda-casual" id="subtitle"]] [[!template text="""So all those packages, they were very innovative for the""" start="00:14:14.240" video="qanda-casual" id="subtitle"]] [[!template text="""time and it's cool to see that some of the ideas which were""" start="00:14:17.960" video="qanda-casual" id="subtitle"]] [[!template text="""introduced by IV and Helm and all this are then taken by tools""" start="00:14:21.200" video="qanda-casual" id="subtitle"]] [[!template text="""like Transient and done perhaps with a little more""" start="00:14:28.040" video="qanda-casual" id="subtitle"]] [[!template text="""hindsight now that people have experienced a little more of""" start="00:14:30.280" video="qanda-casual" id="subtitle"]] [[!template text="""it. Okay, we have still a little bit of time. Moving on to the""" start="00:14:33.640" video="qanda-casual" id="subtitle"]] [[!template text="""next question.""" start="00:14:38.360" video="qanda-casual" id="subtitle"]]
[[!template new="1" text="""Q: What modes are you working on at the moment for casual / are excited to explore?""" start="00:14:40.282" video="qanda-casual" id="subtitle"]]
[[!template text="""What modes are you working on at the moment""" start="00:14:40.282" video="qanda-casual" id="subtitle"]] [[!template text="""for Casual or are you excited to explore?""" start="00:14:41.920" video="qanda-casual" id="subtitle"]] [[!template text="""Well, so I just recently published one for calendar. And so I""" start="00:14:44.160" video="qanda-casual" id="subtitle"]] [[!template text="""think the calendar interface has a lot of really""" start="00:14:54.000" video="qanda-casual" id="subtitle"]] [[!template text="""interesting behavior, particularly its support for""" start="00:14:56.840" video="qanda-casual" id="subtitle"]] [[!template text="""non-Gregorian events, which is, you know, for folks who'd""" start="00:15:00.480" video="qanda-casual" id="subtitle"]] [[!template text="""like, in my case, looking at the lunar calendar, it's great""" start="00:15:07.480" video="qanda-casual" id="subtitle"]] [[!template text="""to have tooling to be able to not have to leave Emacs to figure""" start="00:15:13.080" video="qanda-casual" id="subtitle"]] [[!template text="""out when a lunar date is.""" start="00:15:17.800" video="qanda-casual" id="subtitle"]] [[!template text="""Then, I think, you know, for the most part, My work on casual""" start="00:15:19.760" video="qanda-casual" id="subtitle"]] [[!template text="""was really kind of my summer of code for Emacs here. And so in""" start="00:15:29.600" video="qanda-casual" id="subtitle"]] [[!template text="""many ways, the velocity of casual development is going to""" start="00:15:34.960" video="qanda-casual" id="subtitle"]] [[!template text="""slow down where I've got a big bulk of the modes that I really""" start="00:15:41.520" video="qanda-casual" id="subtitle"]] [[!template text="""wanted to take care of. Um, I think one experimental thing""" start="00:15:48.920" video="qanda-casual" id="subtitle"]] [[!template text="""that I think is very unbaked, but I would, you know, if folks""" start="00:15:57.520" video="qanda-casual" id="subtitle"]] [[!template text="""are interested, uh, maybe looking at it is, uh, taking a look""" start="00:16:01.000" video="qanda-casual" id="subtitle"]] [[!template text="""at edebug and trying to make that an easier thing to do. Um,""" start="00:16:06.880" video="qanda-casual" id="subtitle"]] [[!template text="""that is ambitious. Uh, yeah, so maybe too ambitious.""" start="00:16:13.080" video="qanda-casual" id="subtitle"]] [[!template text="""Uh, other things are like really scary projects.""" start="00:16:18.360" video="qanda-casual" id="subtitle"]] [[!template text="""And so, not to say that""" start="00:16:23.714" video="qanda-casual" id="subtitle"]] [[!template text="""I really have a desire to do it, but another""" start="00:16:25.196" video="qanda-casual" id="subtitle"]] [[!template text="""one would be ediff. Right. Okay. Relitigating it's""" start="00:16:28.320" video="qanda-casual" id="subtitle"]] [[!template text="""interface, um, to have a transient menu. I say""" start="00:16:33.240" video="qanda-casual" id="subtitle"]] [[!template text="""these things, but I'm also scared of those things. Yeah, I""" start="00:16:43.640" video="qanda-casual" id="subtitle"]] [[!template text="""mean, I think it's a lovely way to tackle the project,""" start="00:16:47.920" video="qanda-casual" id="subtitle"]] [[!template text="""really, because you are fully aware that edebug and ediffs""" start="00:16:50.720" video="qanda-casual" id="subtitle"]] [[!template text="""are mastodons when it comes to Emacs. They work very well. If""" start="00:16:55.480" video="qanda-casual" id="subtitle"]] [[!template text="""you've ever tried to do a conflict resolution in Magit and""" start="00:16:59.400" video="qanda-casual" id="subtitle"]] [[!template text="""you've pressed e, that usually opens ediff for you. If you""" start="00:17:02.640" video="qanda-casual" id="subtitle"]] [[!template text="""happen to know how it works, it's amazing, but if you do not know""" start="00:17:07.200" video="qanda-casual" id="subtitle"]] [[!template text="""it works, the interface is a little... It's a lot to take in""" start="00:17:09.960" video="qanda-casual" id="subtitle"]] [[!template text="""at the moment. You have to know a, b, w... I can, and I""" start="00:17:13.720" video="qanda-casual" id="subtitle"]] [[!template text="""can never remember which one is the lower and which one is the""" start="00:17:20.880" video="qanda-casual" id="subtitle"]] [[!template text="""upper. Like, it constantly goes in different directions. I""" start="00:17:24.440" video="qanda-casual" id="subtitle"]] [[!template text="""can never remember which is the commit I'm trying to merge,""" start="00:17:27.360" video="qanda-casual" id="subtitle"]] [[!template text="""which is the commit I'm currently being on. It has nothing to""" start="00:17:29.720" video="qanda-casual" id="subtitle"]] [[!template text="""do with Magit. It's merely Git and the way they conceive""" start="00:17:32.760" video="qanda-casual" id="subtitle"]] [[!template text="""this. And probably, there might be a very nice way to""" start="00:17:36.840" video="qanda-casual" id="subtitle"]] [[!template text="""remember it, but I still haven't found it after 10 years as a""" start="00:17:39.720" video="qanda-casual" id="subtitle"]] [[!template text="""software developer. So, I guess I need to dig a little""" start="00:17:42.080" video="qanda-casual" id="subtitle"]] [[!template text="""deeper. But what I find lovely about the approach is that for""" start="00:17:44.920" video="qanda-casual" id="subtitle"]] [[!template text="""you, working on the interface to those tools is actually""" start="00:17:48.520" video="qanda-casual" id="subtitle"]] [[!template text="""something that allows you to discover how they work, but""" start="00:17:52.600" video="qanda-casual" id="subtitle"]] [[!template text="""also how to make it more easy for people to understand how""" start="00:17:55.160" video="qanda-casual" id="subtitle"]] [[!template text="""those tools work. So you're doing the work of""" start="00:17:59.120" video="qanda-casual" id="subtitle"]] [[!template text="""understanding, of digesting a lot of the commands, so that""" start="00:18:02.040" video="qanda-casual" id="subtitle"]] [[!template text="""people do not have to go through the same pain as you have. So I""" start="00:18:05.400" video="qanda-casual" id="subtitle"]] [[!template text="""find this a very noble endeavor in a way.""" start="00:18:08.600" video="qanda-casual" id="subtitle"]]
[[!template new="1" text="""Getting older""" start="00:18:14.280" video="qanda-casual" id="subtitle"]]
[[!template text="""In so many ways, as perhaps I've mentioned""" start="00:18:14.280" video="qanda-casual" id="subtitle"]] [[!template text="""in my talk, I'm getting older. I can't remember all""" start="00:18:18.560" video="qanda-casual" id="subtitle"]] [[!template text="""these damn commands and my hand dexterity is failing. I""" start="00:18:23.640" video="qanda-casual" id="subtitle"]] [[!template text="""mean, there's so many. Like multiple keystroke""" start="00:18:28.760" video="qanda-casual" id="subtitle"]] [[!template text="""bindings, which I absolutely loathe. At most,""" start="00:18:33.200" video="qanda-casual" id="subtitle"]] [[!template text="""like I can, I can only physically handle like, two""" start="00:18:37.480" video="qanda-casual" id="subtitle"]] [[!template text="""characters, three maybe, at a time. So maybe""" start="00:18:40.800" video="qanda-casual" id="subtitle"]] [[!template text="""that's just me, and others may""" start="00:18:47.800" video="qanda-casual" id="subtitle"]] [[!template text="""feel differently, but at the same time,""" start="00:18:51.240" video="qanda-casual" id="subtitle"]] [[!template text="""the work that I've invested here is has been very personal""" start="00:18:56.000" video="qanda-casual" id="subtitle"]] [[!template text="""for me because I just don't want to work that hard, and I want to""" start="00:19:01.520" video="qanda-casual" id="subtitle"]] [[!template text="""keep using Emacs. Yeah, and that's again a very good""" start="00:19:06.240" video="qanda-casual" id="subtitle"]] [[!template text="""endeavor, I think, to have. And there's one last thing that""" start="00:19:11.160" video="qanda-casual" id="subtitle"]] [[!template text="""I'd like to mention, because you've mentioned this project""" start="00:19:13.720" video="qanda-casual" id="subtitle"]] [[!template text="""of yours, Casual, being some kind of summer of code, with the""" start="00:19:16.040" video="qanda-casual" id="subtitle"]] [[!template text="""implication that you've worked a whole lot of it during the""" start="00:19:19.880" video="qanda-casual" id="subtitle"]] [[!template text="""summer or during this period. and perhaps investment will""" start="00:19:22.400" video="qanda-casual" id="subtitle"]] [[!template text="""die down a little bit now. But I think it's completely fine to""" start="00:19:26.920" video="qanda-casual" id="subtitle"]] [[!template text="""have moments when you feel particularly excited and you do a""" start="00:19:31.120" video="qanda-casual" id="subtitle"]] [[!template text="""lot of work, and sometimes it dies down a little bit.""" start="00:19:33.880" video="qanda-casual" id="subtitle"]] [[!template text="""Personally, I've been... Four years ago, I was working a lot""" start="00:19:36.960" video="qanda-casual" id="subtitle"]] [[!template text="""on Org Roam and I had my Summer of Code on Org Roam. And that was""" start="00:19:41.440" video="qanda-casual" id="subtitle"]] [[!template text="""great. I was able to do a lot of things, to get a lot of things""" start="00:19:44.680" video="qanda-casual" id="subtitle"]] [[!template text="""out of my head. But eventually, you know, you have to go make""" start="00:19:47.160" video="qanda-casual" id="subtitle"]] [[!template text="""some money to survive or you have to take care of family and""" start="00:19:50.560" video="qanda-casual" id="subtitle"]] [[!template text="""stuff like this. So, life tends to get in the way of your""" start="00:19:53.280" video="qanda-casual" id="subtitle"]] [[!template text="""hobbies, especially when, you know, it's so... It's""" start="00:19:56.400" video="qanda-casual" id="subtitle"]] [[!template text="""hobbies that involve so much of your time to get things""" start="00:20:00.520" video="qanda-casual" id="subtitle"]] [[!template text="""right, like programming does. But, you know, we appreciate""" start="00:20:03.240" video="qanda-casual" id="subtitle"]] [[!template text="""all the work you've done, Charles, and the fact that you've""" start="00:20:07.880" video="qanda-casual" id="subtitle"]] [[!template text="""put it out there for people to enjoy. It's already a victory.""" start="00:20:09.800" video="qanda-casual" id="subtitle"]] [[!template text="""You don't need to feel compelled to keep working on it""" start="00:20:12.680" video="qanda-casual" id="subtitle"]] [[!template text="""because ultimately, as you said, the beauty of open source""" start="00:20:15.000" video="qanda-casual" id="subtitle"]] [[!template text="""is that people can just send PRs and get the project going""" start="00:20:18.160" video="qanda-casual" id="subtitle"]] [[!template text="""again. Yeah. I mean, and if anything, you know, folks have""" start="00:20:21.760" video="qanda-casual" id="subtitle"]] [[!template text="""expressed to me that, you know, in many ways, a lot of this""" start="00:20:28.520" video="qanda-casual" id="subtitle"]] [[!template text="""stuff should be, you know, sort of folded in the core. And,""" start="00:20:33.320" video="qanda-casual" id="subtitle"]] [[!template text="""you know, I would love to see at least the ideals of, or at""" start="00:20:37.960" video="qanda-casual" id="subtitle"]] [[!template text="""least an openness into thinking, rethinking the interface""" start="00:20:45.160" video="qanda-casual" id="subtitle"]] [[!template text="""for Emacs. So, you know, it doesn't have to be, basically""" start="00:20:49.320" video="qanda-casual" id="subtitle"]] [[!template text="""work the way it worked for basically the last half of the 20th""" start="00:20:54.120" video="qanda-casual" id="subtitle"]] [[!template text="""century here. Yeah, Emacs is flexible enough to have""" start="00:20:59.120" video="qanda-casual" id="subtitle"]] [[!template text="""different approaches and, you know, transient is one""" start="00:21:03.520" video="qanda-casual" id="subtitle"]] [[!template text="""approach, but at the same time, you know, the ability to""" start="00:21:10.280" video="qanda-casual" id="subtitle"]] [[!template text="""reimagine the user interface for, you know, the computing""" start="00:21:17.760" video="qanda-casual" id="subtitle"]] [[!template text="""needs, you know, for basically users needs today, whether""" start="00:21:22.560" video="qanda-casual" id="subtitle"]] [[!template text="""you write or code or anything of that nature, I think is an""" start="00:21:28.160" video="qanda-casual" id="subtitle"]] [[!template text="""exciting and great thing. Yeah, well, thank you so much for""" start="00:21:33.120" video="qanda-casual" id="subtitle"]] [[!template text="""this conclusion. So I'm a little sorry, because sadly, we""" start="00:21:39.040" video="qanda-casual" id="subtitle"]] [[!template text="""needed to move the stream to the next talk. So we've lost""" start="00:21:41.640" video="qanda-casual" id="subtitle"]] [[!template text="""about 20 seconds of what you said. But don't worry, whatever""" start="00:21:45.920" video="qanda-casual" id="subtitle"]] [[!template text="""you've said will be available on the website. I didn't want""" start="00:21:49.640" video="qanda-casual" id="subtitle"]] [[!template text="""to interrupt, sadly, because I didn't want to be rude. But I""" start="00:21:52.000" video="qanda-casual" id="subtitle"]] [[!template text="""think we did a great job answering the questions. So thank""" start="00:21:55.760" video="qanda-casual" id="subtitle"]] [[!template text="""you so much for taking the time. I'll need to get going,""" start="00:21:58.680" video="qanda-casual" id="subtitle"]] [[!template text="""because we might have a problem with the next talk. So thank""" start="00:22:01.200" video="qanda-casual" id="subtitle"]] [[!template text="""you so much, Charles. Certainly. Take care. Thank you.""" start="00:22:02.760" video="qanda-casual" id="subtitle"]] [[!template text="""Appreciate it. Bye.""" start="00:22:05.920" video="qanda-casual" id="subtitle"]]
Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202023%20casual%3A%20Re-imagining%20the%20Emacs%20user%20experience%20with%20Casual%20Suite)