1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
|
<!-- Automatically generated by emacsconf-publish-after-page -->
<div class="transcript transcript-mainVideo"><a name="casual-mainVideo-transcript"></a><h1>Transcript</h1>
<div class="transcript-heading">[[!template new="1" text="""introduction""" start="00:00:00.000" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Recall vs recognition""" start="00:00:43.800" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Emacs with keyboard-driven menus""" start="00:02:34.800" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Transient""" start="00:03:43.400" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""A Transient menu can be pinned""" start="00:04:08.200" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Modes are apps, really""" start="00:04:29.303" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Transient all the modes!""" start="00:04:59.527" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Casual design principles""" start="00:05:28.040" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Casual design conventions""" start="00:06:17.960" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Casual Dired""" start="00:07:04.366" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Casual EditKit""" start="00:09:06.640" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""EditKit demo""" start="00:10:36.200" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Marking and moving""" start="00:11:31.997" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Rectangles""" start="00:12:53.140" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Numbering""" start="00:14:04.976" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Sorting""" start="00:14:36.600" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Casual has transformed my user experience with Emacs""" start="00:17:04.340" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
<div class="transcript-heading">[[!template new="1" text="""Thanks and acknowledgements""" start="00:17:34.451" video="mainVideo-casual" id="subtitle"]]</div>[[!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"]]
</div>
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)
<!-- End of emacsconf-publish-after-page -->
|