summaryrefslogtreecommitdiffstats
path: root/2024
diff options
context:
space:
mode:
authorEmacsConf <emacsconf-org@gnu.org>2024-12-07 14:45:14 -0500
committerEmacsConf <emacsconf-org@gnu.org>2024-12-07 14:45:14 -0500
commitea645a126beaadeca0ef9551b17b2737fbeb0f24 (patch)
treee1c25a66d9c4eae331d0dc5bbdd5a192468dbd51 /2024
parente9d7329f68b239de0ec7d1cc9a9275fb7ddb5c4b (diff)
downloademacsconf-wiki-ea645a126beaadeca0ef9551b17b2737fbeb0f24.tar.xz
emacsconf-wiki-ea645a126beaadeca0ef9551b17b2737fbeb0f24.zip
Automated commit
Diffstat (limited to '')
-rw-r--r--2024/captions/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main--chapters.vtt56
-rw-r--r--2024/captions/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main.vtt757
-rw-r--r--2024/info/casual-after.md302
-rw-r--r--2024/info/casual-before.md24
4 files changed, 1137 insertions, 2 deletions
diff --git a/2024/captions/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main--chapters.vtt b/2024/captions/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main--chapters.vtt
new file mode 100644
index 00000000..307d693b
--- /dev/null
+++ b/2024/captions/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main--chapters.vtt
@@ -0,0 +1,56 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:00:43.799
+introduction
+
+00:00:43.800 --> 00:02:34.799
+Recall vs recognition
+
+00:02:34.800 --> 00:03:43.399
+Emacs with keyboard-driven menus
+
+00:03:43.400 --> 00:04:08.199
+Transient
+
+00:04:08.200 --> 00:04:29.302
+A Transient menu can be pinned
+
+00:04:29.303 --> 00:04:59.526
+Modes are apps, really
+
+00:04:59.527 --> 00:05:28.039
+Transient all the modes!
+
+00:05:28.040 --> 00:06:17.959
+Casual design principles
+
+00:06:17.960 --> 00:07:04.365
+Casual design conventions
+
+00:07:04.366 --> 00:09:06.639
+Casual Dired
+
+00:09:06.640 --> 00:10:36.199
+Casual EditKit
+
+00:10:36.200 --> 00:11:31.996
+EditKit demo
+
+00:11:31.997 --> 00:12:53.139
+Marking and moving
+
+00:12:53.140 --> 00:14:04.975
+Rectangles
+
+00:14:04.976 --> 00:14:36.599
+Numbering
+
+00:14:36.600 --> 00:17:02.639
+Sorting
+
+00:17:02.640 --> 00:17:34.450
+Casual has transformed my user experience with Emacs
+
+00:17:34.451 --> 00:18:23.720
+Thanks and acknowledgements
diff --git a/2024/captions/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main.vtt b/2024/captions/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main.vtt
new file mode 100644
index 00000000..26187e17
--- /dev/null
+++ b/2024/captions/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main.vtt
@@ -0,0 +1,757 @@
+WEBVTT captioned by sachac, checked by bhavin
+
+NOTE introduction
+
+00:00:00.000 --> 00:00:05.079
+Hello, my name is Charles Choi and welcome to my talk:
+
+00:00:05.080 --> 00:00:11.359
+"Reimagining the Emacs user experience with Casual Suite."
+
+00:00:11.360 --> 00:00:14.919
+Casual Suite is a set of opinionated user interfaces to
+
+00:00:14.920 --> 00:00:18.399
+different modes offered in Emacs. Before I get into
+
+00:00:18.400 --> 00:00:22.199
+describing Casual in detail, let's first talk about the
+
+00:00:22.200 --> 00:00:27.039
+existing Emacs user experience. To make Emacs go, people
+
+00:00:27.040 --> 00:00:31.079
+can either invoke commands by name with
+
+00:00:31.080 --> 00:00:34.081
+execute-extended-command,
+
+00:00:34.082 --> 00:00:36.403
+run a command directly with a pre-assigned
+
+00:00:36.404 --> 00:00:43.799
+key binding, finally, use a mouse menu if it's available.
+
+NOTE Recall vs recognition
+
+00:00:43.800 --> 00:00:46.719
+From human-computer interface research, there is a
+
+00:00:46.720 --> 00:00:50.799
+concept of recall versus recognition in user interface
+
+00:00:50.800 --> 00:00:56.599
+design. Let's show their distinction by example. A common
+
+00:00:56.600 --> 00:01:00.839
+recall interface is password entry. Absent any historical
+
+00:01:00.840 --> 00:01:04.639
+affordances, a user must directly remember information to
+
+00:01:04.640 --> 00:01:09.839
+succeed with this interface. In contrast, menus offer
+
+00:01:09.840 --> 00:01:13.439
+immediate visual cues on what commands are available. This
+
+00:01:13.440 --> 00:01:16.839
+allows a user to recognize familiar behavior to support
+
+00:01:16.840 --> 00:01:21.879
+successful selection of it. From user interface research,
+
+00:01:21.880 --> 00:01:26.119
+the key finding is this. Interfaces emphasizing
+
+00:01:26.120 --> 00:01:29.999
+recognition are much easier to use than those relying on
+
+00:01:30.000 --> 00:01:35.799
+recall. In this light, we see that the Emacs user experience
+
+00:01:35.800 --> 00:01:41.279
+leans too much towards recall. Completion in history can
+
+00:01:41.280 --> 00:01:44.479
+help tip the scales towards recognition, but only by a
+
+00:01:44.480 --> 00:01:47.959
+little bit.
+
+00:01:47.960 --> 00:01:52.399
+This reliance on recall is discouraging to users both new
+
+00:01:52.400 --> 00:01:56.839
+and old, and that's a shame because Emacs has so many useful
+
+00:01:56.840 --> 00:02:00.759
+commands. But the kicker is that most of them are
+
+00:02:00.760 --> 00:02:05.239
+infrequently used. You can't recall them all. At least I
+
+00:02:05.240 --> 00:02:11.239
+can't. So, a conundrum. While I've been using Emacs since
+
+00:02:11.240 --> 00:02:15.159
+the early 90s, truthfully, it's been only in this past
+
+00:02:15.160 --> 00:02:19.679
+decade that I've leveled up in using it. Org Mode, Magit,
+
+00:02:19.680 --> 00:02:23.199
+Eglot, Avy, and many other packages have transformed how I
+
+00:02:23.200 --> 00:02:28.639
+use it. I can only deal with so much cognitive load and
+
+00:02:28.640 --> 00:02:34.799
+physically straining key bindings. So, what to do about it?
+
+NOTE Emacs with keyboard-driven menus
+
+00:02:34.800 --> 00:02:36.159
+Let's bring back an old ideal.
+
+00:02:36.160 --> 00:02:42.359
+Keyboard-driven menus have been around since TTY video
+
+00:02:42.360 --> 00:02:47.359
+terminals with mainframes. If you're old enough to recall
+
+00:02:47.360 --> 00:02:50.079
+working with such interfaces, these terms will seem
+
+00:02:50.080 --> 00:02:53.239
+familiar. They all worked with the limitations of
+
+00:02:53.240 --> 00:02:57.639
+text-based video displays.
+
+00:02:57.640 --> 00:03:01.599
+With keyboard-driven menus, if a command exists but nobody
+
+00:03:01.600 --> 00:03:05.519
+can find it, it's not really useful. A well-designed menu
+
+00:03:05.520 --> 00:03:09.719
+can make a command discoverable. If the command is
+
+00:03:09.720 --> 00:03:15.199
+infrequently used, making it recognizable helps a lot. And
+
+00:03:15.200 --> 00:03:18.679
+for working primarily with text, having keyboard-only
+
+00:03:18.680 --> 00:03:24.119
+interactions encourages flow. Given the above, the next
+
+00:03:24.120 --> 00:03:28.479
+steps seem natural:
+
+00:03:28.480 --> 00:03:32.759
+augment Emacs with keyboard-driven menus. This is not
+
+00:03:32.760 --> 00:03:36.639
+saying that I want to obsolete name commands, keybindings,
+
+00:03:36.640 --> 00:03:41.079
+and mouse menus. They all can happily coexist. Emacs is
+
+00:03:41.080 --> 00:03:43.399
+large. It can contain multitudes.
+
+NOTE Transient
+
+00:03:43.400 --> 00:03:49.879
+Conveniently, Emacs has a built-in library for building
+
+00:03:49.880 --> 00:03:53.839
+such menus. It's called Transient, and it's been around
+
+00:03:53.840 --> 00:03:59.319
+since Emacs 28. Developed primarily by Jonas Bernoulli as a
+
+00:03:59.320 --> 00:04:03.199
+UI toolkit for Magit, Transient has an essential feature
+
+00:04:03.200 --> 00:04:08.199
+for building great keyboard-driven interfaces.
+
+NOTE A Transient menu can be pinned
+
+00:04:08.200 --> 00:04:11.919
+A transient menu can be pinned and their state updated as
+
+00:04:11.920 --> 00:04:15.239
+commands are issued from them. This lets us build
+
+00:04:15.240 --> 00:04:18.399
+interfaces that reflect internal state changes made by
+
+00:04:18.400 --> 00:04:21.919
+commands issued from the user. This is great because many
+
+00:04:21.920 --> 00:04:26.599
+modes have stateful behavior, and guess what? Emacs has a lot
+
+00:04:26.600 --> 00:04:29.302
+of modes.
+
+NOTE Modes are apps, really
+
+00:04:29.303 --> 00:04:31.999
+If you think about it, Emacs modes are akin to the
+
+00:04:32.000 --> 00:04:35.079
+ecosystem of apps that we see today, but with far less
+
+00:04:35.080 --> 00:04:39.319
+structure and packaging. A mode, like an app, focuses on
+
+00:04:39.320 --> 00:04:42.959
+delivering specific behavior to the user. There are many
+
+00:04:42.960 --> 00:04:45.999
+built-in modes in Emacs, and these modes are complex with
+
+00:04:46.000 --> 00:04:50.679
+dozens, if not hundreds, of commands. Calc itself has over
+
+00:04:50.680 --> 00:04:54.879
+1,000 of them. It's frustrating to know that these commands
+
+00:04:54.880 --> 00:04:59.526
+are there, but I really can't access them via recall.
+
+NOTE Transient all the modes!
+
+00:04:59.527 --> 00:05:05.079
+So I decided to do something about it, and that was to transient
+
+00:05:05.080 --> 00:05:09.999
+all the modes, or at least the most major ones. This past
+
+00:05:10.000 --> 00:05:12.679
+summer, I had the time and resources to start building
+
+00:05:12.680 --> 00:05:15.799
+Transient interfaces for modes that I wanted to more
+
+00:05:15.800 --> 00:05:22.319
+elegantly use. I decided to call this work Casual. Given its
+
+00:05:22.320 --> 00:05:25.519
+definition, it seemed like a good fit for the vibe that I
+
+00:05:25.520 --> 00:05:28.039
+wanted these interfaces to embody.
+
+NOTE Casual design principles
+
+00:05:28.040 --> 00:05:34.999
+Design principles that I embraced up front were
+
+00:05:35.000 --> 00:05:38.239
+handcrafted information architecture and layout. This is
+
+00:05:38.240 --> 00:05:41.799
+largely an exercise in mapping a mode's command set to a
+
+00:05:41.800 --> 00:05:47.119
+hierarchical menu structure. I wanted these menus to make
+
+00:05:47.120 --> 00:05:50.719
+sense to most people. Ideally, users would not have to read
+
+00:05:50.720 --> 00:05:55.839
+documentation to get at the command that they wanted. Early
+
+00:05:55.840 --> 00:05:59.359
+on, I quickly learned that it was impossible to maintain the
+
+00:05:59.360 --> 00:06:02.479
+existing default key bindings when mapping them over to a
+
+00:06:02.480 --> 00:06:06.759
+hierarchical menu. Also, some bindings I just flat out
+
+00:06:06.760 --> 00:06:10.199
+disagreed with. I resolved to be friendly, but not
+
+00:06:10.200 --> 00:06:14.919
+beholden to them. In all of the above, I've gone out of my way
+
+00:06:14.920 --> 00:06:17.959
+to make clear that my design decisions are opinionated.
+
+NOTE Casual design conventions
+
+00:06:17.960 --> 00:06:21.719
+Using casual.
+
+00:06:21.720 --> 00:06:30.039
+To reinforce habit, a common key binding is used per mode to
+
+00:06:30.040 --> 00:06:33.799
+raise a main menu. This key binding is left to user
+
+00:06:33.800 --> 00:06:36.719
+preference. For me, that binding is C-o.
+
+00:06:36.720 --> 00:06:44.639
+Command bindings are mnemonic when possible.
+
+00:06:44.640 --> 00:06:49.559
+Mode-specific settings are given their own menu. Since
+
+00:06:49.560 --> 00:06:53.319
+transient menus can be pinned, we can support repeat or
+
+00:06:53.320 --> 00:06:58.479
+stateful behavior in a mode.
+
+00:06:58.480 --> 00:07:02.319
+As of this writing, there are 11 modes supported by Casual,
+
+00:07:02.320 --> 00:07:04.365
+with several more on the way.
+
+NOTE Casual Dired
+
+00:07:04.366 --> 00:07:05.719
+Let's look at the Casual menu
+
+00:07:05.720 --> 00:07:12.479
+for Dired to highlight the design conventions previously
+
+00:07:12.480 --> 00:07:13.559
+mentioned.
+
+00:07:13.560 --> 00:07:17.719
+In a Dired Emacs window, the user can invoke their preferred
+
+00:07:17.720 --> 00:07:22.279
+key binding to call a top-level Casual main menu. This main
+
+00:07:22.280 --> 00:07:27.919
+menu is displayed at the bottom of the Emacs frame. Zooming
+
+00:07:27.920 --> 00:07:30.839
+into this menu, we see the commands offered in it
+
+00:07:30.840 --> 00:07:34.559
+categorized into different sections. Each command has a
+
+00:07:34.560 --> 00:07:38.039
+key binding, usually a single character shown before its
+
+00:07:38.040 --> 00:07:42.599
+label. The File section holds commands that act upon the
+
+00:07:42.600 --> 00:07:47.559
+currently selected item or marked items. The Directory
+
+00:07:47.560 --> 00:07:50.319
+section holds commands that affect the current directory
+
+00:07:50.320 --> 00:07:55.599
+or its subdirs within it. The Mark section has marking
+
+00:07:55.600 --> 00:08:00.279
+commands that allow for aggregate operations. The
+
+00:08:00.280 --> 00:08:03.399
+Navigation section shows commands that move the point in a
+
+00:08:03.400 --> 00:08:09.559
+direct buffer. The quick section provides access to
+
+00:08:09.560 --> 00:08:14.519
+bookmark and buffer list commands. Search and replace
+
+00:08:14.520 --> 00:08:19.119
+commands are grouped in the search section. New directory
+
+00:08:19.120 --> 00:08:24.079
+and file creation are given their own section. Finally, at
+
+00:08:24.080 --> 00:08:27.599
+the bottom of the menu are commands dedicated to Casual menu
+
+00:08:27.600 --> 00:08:28.439
+navigation.
+
+00:08:28.440 --> 00:08:34.079
+Casual is conformant to Transient conventions where the
+
+00:08:34.080 --> 00:08:39.479
+key binding C-g for dismiss one and C-q to dismiss all
+
+00:08:39.480 --> 00:08:43.639
+menus are honored. Another transient convention is to
+
+00:08:43.640 --> 00:08:49.519
+reserve the key binding q to quit the current mode. For most
+
+00:08:49.520 --> 00:08:53.959
+main menus, casual uses the , key binding to invoke a
+
+00:08:53.960 --> 00:08:58.999
+mode-specific settings menu. Casual also adopts the
+
+00:08:59.000 --> 00:09:02.039
+common UI convention of using ... >
+
+00:09:02.040 --> 00:09:05.879
+symbols to denote required input and submenus
+
+00:09:05.880 --> 00:09:06.639
+respectively.
+
+NOTE Casual EditKit
+
+00:09:06.640 --> 00:09:13.919
+Some commands are more global or non-mode specific in
+
+00:09:13.920 --> 00:09:18.039
+nature. A great deal of these commands relate to editing,
+
+00:09:18.040 --> 00:09:23.239
+which I find to be a prime motivation for using Emacs. Let's
+
+00:09:23.240 --> 00:09:25.559
+examine one such menu that supports this.
+
+00:09:25.560 --> 00:09:31.599
+The main menu for Casual EditKit is designed to provide easy
+
+00:09:31.600 --> 00:09:36.279
+access to editing and editing-related commands. Like the
+
+00:09:36.280 --> 00:09:39.959
+previous Dired menu, it organizes commands into different
+
+00:09:39.960 --> 00:09:40.679
+sections.
+
+00:09:40.680 --> 00:09:45.999
+Commands related to file and buffer operations are in the
+
+00:09:46.000 --> 00:09:50.519
+File section. Commands for editing text are in the Edit
+
+00:09:50.520 --> 00:09:55.599
+section. S- or balanced expression commands are given a
+
+00:09:55.600 --> 00:09:59.439
+dedicated section for their own. More often than not, in
+
+00:09:59.440 --> 00:10:02.159
+many modes, I find them to do what I want.
+
+00:10:02.160 --> 00:10:08.879
+The tools section provides access to common tools.
+
+00:10:08.880 --> 00:10:13.719
+Bookmarks I consider to be an essential feature. If you
+
+00:10:13.720 --> 00:10:18.439
+haven't used them, it's never too late to start. Emacs
+
+00:10:18.440 --> 00:10:20.799
+window management commands are given this section.
+
+00:10:20.800 --> 00:10:25.799
+Commands for search and replace, macros, and projects can
+
+00:10:25.800 --> 00:10:32.199
+be accessed from here. Finally, the menu navigation
+
+00:10:32.200 --> 00:10:35.719
+section. Note that register commands can be accessed from
+
+00:10:35.720 --> 00:10:36.199
+here.
+
+NOTE EditKit demo
+
+00:10:36.200 --> 00:10:42.439
+Okay, enough screenshots. Let's look at Casual in action
+
+00:10:42.440 --> 00:10:48.439
+with a demo of the EditKit menus. Let's start our demo of
+
+00:10:48.440 --> 00:10:54.439
+casual-editkit with raising the menu, which is bound to
+
+00:10:54.440 --> 00:10:58.919
+C-o. You'll see the menu pop up here. In
+
+00:10:58.920 --> 00:11:02.519
+particular, we want to look at the edit operation. We'll
+
+00:11:02.520 --> 00:11:08.679
+press e and we'll see a number of menu items that allow you to
+
+00:11:08.680 --> 00:11:16.239
+make editing transformations to the text, be it marking,
+
+00:11:16.240 --> 00:11:20.239
+copying, killing, transposing, transforming, moving, or
+
+00:11:20.240 --> 00:11:24.279
+deleting the text. You'll see also that there is a submenu
+
+00:11:24.280 --> 00:11:31.996
+for rectangle operations. Let's first...
+
+NOTE Marking and moving
+
+00:11:31.997 --> 00:11:37.406
+Let's actually dig through and look at what's in the Mark submenu.
+
+00:11:37.407 --> 00:11:42.039
+You'll see that there are increments of text in which you can
+
+00:11:42.040 --> 00:11:45.239
+mark. You can mark a word, a sentence, a paragraph, and
+
+00:11:45.240 --> 00:11:49.559
+balanced expression. If we go back, you'll see a similar
+
+00:11:49.560 --> 00:11:57.339
+pattern for copying as well as killing. Transposing.
+
+00:11:57.340 --> 00:12:02.879
+Let's go and try to move a sentence. We have the point there at
+
+00:12:02.880 --> 00:12:07.119
+hello there. We'll move that sentence around. If we
+
+00:12:07.120 --> 00:12:12.119
+press s, we can move it backward or forward. In this case,
+
+00:12:12.120 --> 00:12:16.279
+let's move it forward. We'll press f. You'll see hello
+
+00:12:16.280 --> 00:12:21.639
+there move up a sentence. Then we can also press b to move
+
+00:12:21.640 --> 00:12:29.879
+it back. Then press RET to dismiss. Also, if we wanted
+
+00:12:29.880 --> 00:12:35.199
+to, we can... In this menu particularly, you'll see that we
+
+00:12:35.200 --> 00:12:38.839
+also have cursor navigation, so we can move the point there.
+
+00:12:38.840 --> 00:12:43.039
+That's not in all the menus, but in a good part number of the
+
+00:12:43.040 --> 00:12:47.919
+menus in Casual Edit Kit, you'll see that here. Let's press
+
+00:12:47.920 --> 00:12:53.139
+RET to dismiss that.
+
+NOTE Rectangles
+
+00:12:53.140 --> 00:12:58.643
+Let's actually look at some rectangle operations here.
+
+00:12:58.644 --> 00:13:01.759
+In this case, we have a list with
+
+00:13:01.760 --> 00:13:08.519
+items x, y, and z. Let's say we wanted to prefix each item
+
+00:13:08.520 --> 00:13:14.239
+here with a string. We'll say we want to put in there
+
+00:13:14.240 --> 00:13:21.159
+hello. One way of doing that is to make a rectangle. So
+
+00:13:21.160 --> 00:13:25.719
+if we go into our rectangle menu, first off, what we need to do
+
+00:13:25.720 --> 00:13:31.199
+is define that rectangle region. We'll press m to mark
+
+00:13:31.200 --> 00:13:35.439
+where the point is right there. Then we can use our cursor
+
+00:13:35.440 --> 00:13:39.559
+operation to move the point to define the rectangle. In this
+
+00:13:39.560 --> 00:13:43.839
+case, it's right at the start there. We can use the string
+
+00:13:43.840 --> 00:13:49.679
+insert command, i, to insert hello, colon, and then we'll
+
+00:13:49.680 --> 00:13:54.799
+put a space there to make it look a little nicer. Sure
+
+00:13:54.800 --> 00:13:58.119
+enough, that's in there.
+
+00:13:58.120 --> 00:14:04.975
+We can have access to a number of rectangle commands here.
+
+NOTE Numbering
+
+00:14:04.976 --> 00:14:11.599
+If we wanted to, let's say, number, we can go through that same
+
+00:14:11.600 --> 00:14:16.719
+operation here, define a region, a rectangle region that
+
+00:14:16.720 --> 00:14:22.679
+is, and press n. You'll see that it has incremented a
+
+00:14:22.680 --> 00:14:28.639
+number for each item in that rectangle region. We can also
+
+00:14:28.640 --> 00:14:32.468
+tap u to undo these operations
+
+00:14:32.469 --> 00:14:36.599
+and leave that at that.
+
+NOTE Sorting
+
+00:14:36.600 --> 00:14:47.239
+Sorting. If we select a region here, And we go back. You'll
+
+00:14:47.240 --> 00:14:52.399
+see that the sort submenu is now enabled. Sorting won't work
+
+00:14:52.400 --> 00:14:56.239
+unless you have a region started. That's one of the nice
+
+00:14:56.240 --> 00:15:01.679
+things about transient is that it allows you to visually
+
+00:15:01.680 --> 00:15:09.079
+enable or disable command items with regards to whatever
+
+00:15:09.080 --> 00:15:12.559
+the current state or context is here. In this case is
+
+00:15:12.560 --> 00:15:17.359
+whether or not you have a region highlighted. Let's say we
+
+00:15:17.360 --> 00:15:22.879
+want to sort these two columns of numbers and so there's a
+
+00:15:22.880 --> 00:15:29.759
+command called n here which is numeric fields. Let's choose that
+
+00:15:29.760 --> 00:15:35.919
+here. Sure enough we get that. But there's a nice twist
+
+00:15:35.920 --> 00:15:39.679
+there. Let's say we wanted to sort on the second column.
+
+00:15:39.680 --> 00:15:48.919
+Let's move our point back up to here and we'll mark that.
+
+00:15:48.920 --> 00:15:52.799
+Since everything is in a continuous line, we can sort of
+
+00:15:52.800 --> 00:15:55.948
+pretend that this region is actually a paragraph
+
+00:15:55.949 --> 00:15:59.359
+and mark that.
+
+00:15:59.360 --> 00:16:06.999
+We'll go and select our sorting routine. But now we need to
+
+00:16:07.000 --> 00:16:11.319
+figure out how to make numeric fields sort on the second
+
+00:16:11.320 --> 00:16:16.359
+column. In transient, if we press a ?, that
+
+00:16:16.360 --> 00:16:21.439
+gives us basically a intermediate help section where, if we
+
+00:16:21.440 --> 00:16:27.279
+press a key binding, it will tell us or load the docstring for
+
+00:16:27.280 --> 00:16:33.039
+the command that's there. That command in this case is
+
+00:16:33.040 --> 00:16:40.039
+sort-numeric-fields. It requires an argument. That
+
+00:16:40.040 --> 00:16:44.079
+argument can be passed using the prefix argument,
+
+00:16:44.080 --> 00:16:52.119
+C-u. Press q. Let's do that. In this case, we
+
+00:16:52.120 --> 00:16:58.679
+want to check or use the value 2 and press n. Sure enough,
+
+00:16:58.680 --> 00:17:04.339
+that region is sorted with respect to the second column.
+
+NOTE Casual has transformed my user experience with Emacs
+
+00:17:04.340 --> 00:17:12.159
+Before Casual, so many powerful Emacs commands were not
+
+00:17:12.160 --> 00:17:15.559
+available to me because they were too hard to recall or I
+
+00:17:15.560 --> 00:17:19.879
+could not discover them. Making Casual has changed that,
+
+00:17:19.880 --> 00:17:24.359
+letting me reimagine more positively my user experience
+
+00:17:24.360 --> 00:17:29.199
+with Emacs. If you're interested in any of what I've shown
+
+00:17:29.200 --> 00:17:34.450
+today, I invite you to try out Casual.
+
+NOTE Thanks and acknowledgements
+
+00:17:34.451 --> 00:17:37.032
+Before I leave, my thanks and acknowledgments
+
+00:17:37.033 --> 00:17:38.679
+go out to the following people.
+
+00:17:38.680 --> 00:17:43.399
+First, to Jonas Bernoulli for making Transient and Magit.
+
+00:17:43.400 --> 00:17:49.319
+Casual would not be possible without your work. Next, to
+
+00:17:49.320 --> 00:17:54.399
+Psionic-k for writing Transient Showcase. It showed me how I
+
+00:17:54.400 --> 00:17:59.439
+could build casual. To all the casual users and their
+
+00:17:59.440 --> 00:18:05.319
+support, I am genuinely appreciative. Finally, to Jon
+
+00:18:05.320 --> 00:18:08.759
+Snader for writing the kind posts on Casual on the Irreal
+
+00:18:08.760 --> 00:18:10.519
+website. Thank you.
+
+00:18:10.520 --> 00:18:15.797
+Casual can be found on MELPA,
+
+00:18:15.798 --> 00:18:23.720
+and its repository is hosted on GitHub.
diff --git a/2024/info/casual-after.md b/2024/info/casual-after.md
index abb1f6fd..8236156e 100644
--- a/2024/info/casual-after.md
+++ b/2024/info/casual-after.md
@@ -1,6 +1,308 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="casual-mainVideo-transcript"></a>
+# 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="""&quot;Reimagining the Emacs user experience with Casual Suite.&quot;""" 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
+
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)
diff --git a/2024/info/casual-before.md b/2024/info/casual-before.md
index 09c3f7bd..f5dd0852 100644
--- a/2024/info/casual-before.md
+++ b/2024/info/casual-before.md
@@ -1,19 +1,39 @@
<!-- 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="casual">
-<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 stroke-width="3" x="473" y="15" opacity="0.8" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(498,73)"> <text font-weight="bold" 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 x="610" y="15" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(642,73)"> <text 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 stroke-width="3" x="473" y="15" opacity="0.8" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(498,73)"> <text font-weight="bold" 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 x="610" y="15" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(642,73)"> <text 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: 19-min talk ; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2024/current/bbb-casual.html> Etherpad: <https://pad.emacsconf.org/2024-casual>
Etherpad: <https://pad.emacsconf.org/2024-casual>
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-07T19:45:00Z" end="2024-12-07T20:05:00Z"><div class="conf-time">Saturday, Dec 7 2024, ~2:45 PM - 3:05 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 7 2024, ~1:45 PM - 2:05 PM CST (US/Central)<br />Saturday, Dec 7 2024, ~12:45 PM - 1:05 PM MST (US/Mountain)<br />Saturday, Dec 7 2024, ~11:45 AM - 12:05 PM PST (US/Pacific)<br />Saturday, Dec 7 2024, ~7:45 PM - 8:05 PM UTC <br />Saturday, Dec 7 2024, ~8:45 PM - 9:05 PM CET (Europe/Paris)<br />Saturday, Dec 7 2024, ~9:45 PM - 10:05 PM EET (Europe/Athens)<br />Sunday, Dec 8 2024, ~1:15 AM - 1:35 AM IST (Asia/Kolkata)<br />Sunday, Dec 8 2024, ~3:45 AM - 4:05 AM +08 (Asia/Singapore)<br />Sunday, Dec 8 2024, ~4:45 AM - 5:05 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="casual-mainVideo"><source src="https://media.emacsconf.org/2024/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2024/captions/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2024/captions/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--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="casual-mainVideo" data="""
+00:00.000 introduction
+00:43.800 Recall vs recognition
+02:34.800 Emacs with keyboard-driven menus
+03:43.400 Transient
+04:08.200 A Transient menu can be pinned
+04:29.303 Modes are apps, really
+04:59.527 Transient all the modes!
+05:28.040 Casual design principles
+06:17.960 Casual design conventions
+07:04.366 Casual Dired
+09:06.640 Casual EditKit
+10:36.200 EditKit demo
+11:31.997 Marking and moving
+12:53.140 Rectangles
+14:04.976 Numbering
+14:36.600 Sorting
+17:02.640 Casual has transformed my user experience with Emacs
+17:34.451 Thanks and acknowledgements
+"""]]<div></div>Duration: 18:24 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2024-casual">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2024/current/bbb-casual.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-casual--reimagining-the-emacs-user-experience-with-casual-suite--charles-choi--main.webm">Download --main.webm (32MB)</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file