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
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
|
WEBVTT
00:00:08.620 --> 00:00:09.120
[Speaker 0]: And I think we are live.
00:00:09.620 --> 00:00:09.960
Hello again, everyone.
00:00:10.940 --> 00:00:11.440
And hi, Lovro. How are you doing?
00:00:15.339 --> 00:00:15.839
[Speaker 1]: Just a second. Should I join the other room?
00:00:18.460 --> 00:00:18.740
[Speaker 0]: Oh, no, no, you can stay here.
00:00:20.860 --> 00:00:21.360
[Speaker 1]: I can stay in the backstage.
00:00:24.140 --> 00:00:24.320
[Speaker 0]: Everything is fine. I don't think you are
00:00:25.520 --> 00:00:25.760
technically in the backstage right now you're
00:00:26.750 --> 00:00:26.820
just in Big Blue Button with us.
00:00:30.040 --> 00:00:30.160
[Speaker 1]: Oh thanks. Oh because I have 2 of them open I
00:00:30.920 --> 00:00:31.280
thought there were 2 different rooms.
00:00:32.720 --> 00:00:33.220
1 is the backstage and the other,
00:00:38.239 --> 00:00:38.360
[Speaker 0]: whichever, I can hear you and so can the
00:00:39.840 --> 00:00:40.080
stream, so don't worry too much about which
00:00:41.140 --> 00:00:41.220
is the backstage and which is the front page.
00:00:41.540 --> 00:00:41.760
[Speaker 1]: I have no idea. Well, great,
00:00:43.660 --> 00:00:43.940
great. Okay, yeah. Yeah,
00:00:45.280 --> 00:00:45.480
I'm doing great, just to answer your
00:00:45.480 --> 00:00:45.980
question.
00:00:47.379 --> 00:00:47.640
[Speaker 0]: Okay, great, great, Okay,
00:00:49.900 --> 00:00:50.280
well splendid. So, I've pasted a link again
00:00:51.520 --> 00:00:51.760
on IRC if you want to ask your questions,
00:00:53.000 --> 00:00:53.200
and I'd invite you to do so,
00:00:54.620 --> 00:00:55.040
because we have about 9 minutes of laborious
00:00:56.580 --> 00:00:57.080
time to answer as many of them as possible.
00:00:58.360 --> 00:00:58.860
And I'm going to start with the first 1.
00:01:01.100 --> 00:01:01.600
This looks great and was very well-presented.
00:01:03.240 --> 00:01:03.420
Do you have plans to upstream this
00:01:04.239 --> 00:01:04.739
functionality into Emacs?
00:01:08.000 --> 00:01:08.200
[Speaker 1]: That's a good idea. That's something we
00:01:08.860 --> 00:01:09.360
thought about as well.
00:01:11.640 --> 00:01:12.140
Currently, we haven't really contacted anyone
00:01:16.160 --> 00:01:16.660
to do this. Also, the current implementation,
00:01:19.760 --> 00:01:20.080
so as I mentioned in the presentation towards
00:01:22.120 --> 00:01:22.300
the end, so we use a little bit of advice to
00:01:24.240 --> 00:01:24.520
sort of patch some functionality of query
00:01:26.479 --> 00:01:26.600
replace because not everything was easy to
00:01:28.680 --> 00:01:29.180
implement. The core functionality luckily
00:01:32.220 --> 00:01:32.340
was, But there's a couple of fixes we need to
00:01:34.200 --> 00:01:34.340
apply to the message function in order to
00:01:36.380 --> 00:01:36.820
display a nice message in the echo buffer
00:01:39.140 --> 00:01:39.320
because this doesn't happen on its own when
00:01:41.100 --> 00:01:41.580
we're using this trick with this big regex
00:01:45.360 --> 00:01:45.720
and whatnot. So I don't think that the code
00:01:47.080 --> 00:01:47.580
as it is would be upstreamable.
00:01:50.600 --> 00:01:51.100
I think probably if we wanted to upstream it,
00:01:54.140 --> 00:01:54.280
we would have to do some proper work on
00:01:57.180 --> 00:01:57.340
refactoring query place itself in order to
00:01:58.780 --> 00:01:58.979
integrate all of this functionality just
00:02:01.880 --> 00:02:02.380
directly without any patching left and right.
00:02:05.680 --> 00:02:06.120
But yeah, definitely something I've given
00:02:10.080 --> 00:02:10.259
some thought, but so far no progress on it.
00:02:11.640 --> 00:02:11.980
I haven't actually started doing anything
00:02:12.240 --> 00:02:12.740
about it.
00:02:17.440 --> 00:02:17.780
[Speaker 0]: Right, So I'm curious now,
00:02:19.640 --> 00:02:19.900
you developed the feature and then you moved
00:02:21.600 --> 00:02:21.740
on to the presentation or did you want to do
00:02:23.080 --> 00:02:23.200
a presentation for EmacsConf and then you
00:02:24.140 --> 00:02:24.640
worked on something like this?
00:02:26.360 --> 00:02:26.860
Which was it first, the chicken or the egg?
00:02:28.220 --> 00:02:28.720
[Speaker 1]: Yeah, it was the former.
00:02:31.320 --> 00:02:31.820
So this is a problem I've been aware of for,
00:02:33.340 --> 00:02:33.840
I mean, probably a couple of years.
00:02:35.280 --> 00:02:35.640
And, you know, I talked to my friend
00:02:37.600 --> 00:02:37.840
Valentino about it and we had like a little
00:02:39.240 --> 00:02:39.740
discussion, you know, how would we do this?
00:02:41.880 --> 00:02:42.380
And then I remember back when I was
00:02:44.140 --> 00:02:44.260
researching about this problem and the
00:02:45.100 --> 00:02:45.600
various Emacs Lisp solutions,
00:02:47.780 --> 00:02:47.960
all I could find were these solutions that
00:02:49.400 --> 00:02:49.600
would, you know, just shy away from
00:02:50.640 --> 00:02:50.920
implementing the RegEx case,
00:02:52.340 --> 00:02:52.840
which is a really complicated 1.
00:02:54.720 --> 00:02:55.220
And, after some discussion,
00:02:56.140 --> 00:02:56.580
my friend and I decided,
00:02:58.080 --> 00:02:58.320
okay, what the hell? Let's,
00:02:59.280 --> 00:02:59.480
let's try and implement this.
00:03:01.800 --> 00:03:02.300
How hard can it be? And yeah,
00:03:03.280 --> 00:03:03.780
basically in 1 afternoon,
00:03:06.300 --> 00:03:06.500
the idea, our little trick and the whole
00:03:07.440 --> 00:03:07.940
implementation was born.
00:03:11.480 --> 00:03:11.680
And then I think that was maybe around a year
00:03:12.540 --> 00:03:13.040
ago, maybe a bit less.
00:03:14.480 --> 00:03:14.680
And then through the months,
00:03:15.920 --> 00:03:16.420
we just thought, oh yeah,
00:03:17.420 --> 00:03:17.640
maybe we could present this,
00:03:18.960 --> 00:03:19.200
maybe it would be interesting for people to
00:03:20.660 --> 00:03:20.920
see and that's how we came up with the idea
00:03:22.440 --> 00:03:22.940
to present at EmacsConf.
00:03:27.900 --> 00:03:28.180
[Speaker 0]: Okay, great. I don't see other people asking
00:03:30.240 --> 00:03:30.540
questions. So people, it's nice if I ask
00:03:31.100 --> 00:03:31.600
questions but you know,
00:03:33.160 --> 00:03:33.340
the point is kind of for you to ask the
00:03:35.140 --> 00:03:35.280
questions. I see someone who's joined us on
00:03:36.780 --> 00:03:37.120
BBB. Peter, would you like to ask a question
00:03:41.720 --> 00:03:41.980
maybe? Otherwise I see another person writing
00:03:43.040 --> 00:03:43.260
a question on the pad,
00:03:44.540 --> 00:03:44.700
so we can either move for this 1.
00:03:46.640 --> 00:03:46.800
So I'll leave Peter to figure out if they
00:03:47.680 --> 00:03:47.960
want to ask a question.
00:03:49.160 --> 00:03:49.660
So I'm moving on to the next question.
00:03:57.900 --> 00:03:58.180
[Speaker 2]: I can jump in. That's a really well done talk
00:04:01.780 --> 00:04:02.120
and you really clearly laid out the problem
00:04:03.000 --> 00:04:03.500
and the solution there.
00:04:05.600 --> 00:04:05.740
While I was watching it,
00:04:10.740 --> 00:04:11.040
I was thinking maybe the nice way to name it
00:04:13.140 --> 00:04:13.440
is just to name it query replace and query
00:04:15.700 --> 00:04:16.019
replace regext, you know,
00:04:18.480 --> 00:04:18.980
overloading the original functions and then
00:04:23.000 --> 00:04:23.460
using a prefix number,
00:04:26.880 --> 00:04:27.380
like control number to indicate how many
00:04:29.280 --> 00:04:29.780
replacements you're going to do.
00:04:31.640 --> 00:04:32.140
But maybe that doesn't work with the
00:04:36.680 --> 00:04:37.120
recursive editing stuff,
00:04:37.960 --> 00:04:38.180
which I don't use much.
00:04:40.440 --> 00:04:40.940
So I don't have a good method.
00:04:43.260 --> 00:04:43.760
[Speaker 1]: I think it would definitely work.
00:04:46.260 --> 00:04:46.440
Well, the question is,
00:04:47.880 --> 00:04:48.380
if we just overwrite the definitions,
00:04:51.700 --> 00:04:52.200
then, oh, well, I guess we could do that.
00:04:53.410 --> 00:04:53.560
Nothing stops us. I mean,
00:04:54.800 --> 00:04:54.880
we're in Emacs. We could definitely do that.
00:04:55.680 --> 00:04:55.920
And then if you give, like,
00:04:57.540 --> 00:04:57.720
a prefix argument, maybe it just drops you
00:04:59.060 --> 00:04:59.560
back to the original query replace.
00:05:01.000 --> 00:05:01.160
Yeah, that's an idea. For now,
00:05:02.440 --> 00:05:02.920
we decided, OK, let's just keep everything
00:05:05.000 --> 00:05:05.240
explicitly separate just to avoid any
00:05:05.240 --> 00:05:05.740
confusion.
00:05:09.220 --> 00:05:09.400
[Speaker 2]: Yeah, I think that's the right thing to do
00:05:11.820 --> 00:05:12.320
for now. What I'm actually thinking is that
00:05:13.620 --> 00:05:13.940
when you do query replace,
00:05:15.600 --> 00:05:16.100
it just does the regular query replace.
00:05:17.220 --> 00:05:17.440
And if you're going to do,
00:05:20.140 --> 00:05:20.640
say, 3 parallel replacements,
00:05:21.340 --> 00:05:21.840
then you do Control-U,
00:05:25.580 --> 00:05:26.080
query replace. Sorry. Control-3,
00:05:28.580 --> 00:05:28.860
query replace. And then that way you don't
00:05:33.400 --> 00:05:33.760
have The final prompt that you give nothing
00:05:33.760 --> 00:05:34.260
to.
00:05:36.880 --> 00:05:37.380
[Speaker 1]: Exactly, that's actually not a bad idea.
00:05:39.720 --> 00:05:40.080
I think I like that. Yeah,
00:05:40.800 --> 00:05:41.300
that's not a bad idea.
00:05:44.760 --> 00:05:44.920
[Speaker 0]: It's always a quagmire whether to ask for an
00:05:47.080 --> 00:05:47.580
argument or to use the universal argument.
00:05:51.060 --> 00:05:51.380
When you're working with Emacs and especially
00:05:52.640 --> 00:05:52.960
the UX side of things in the package,
00:05:54.900 --> 00:05:55.020
it's so complicated to figure out which 1 you
00:05:56.880 --> 00:05:57.380
want to do. In this particular case,
00:06:00.340 --> 00:06:00.840
I think it's the better option to use the
00:06:02.800 --> 00:06:03.120
universal argument or any kind of argument
00:06:04.040 --> 00:06:04.540
with a control number before.
00:06:10.240 --> 00:06:10.440
All right, we have about 3 more minutes of
00:06:12.440 --> 00:06:12.720
questions. Peter, if you don't mind,
00:06:14.440 --> 00:06:14.940
I'll keep reading the questions in the chat.
00:06:19.440 --> 00:06:19.940
Did you use pair programming while developing
00:06:21.100 --> 00:06:21.600
it, it being a package,
00:06:22.440 --> 00:06:22.940
or did you work independently,
00:06:24.840 --> 00:06:25.340
alternating and reviewing with Valentino?
00:06:28.320 --> 00:06:28.440
[Speaker 1]: It was definitely a pair programming kind of
00:06:29.440 --> 00:06:29.940
thing. So if I remember correctly,
00:06:32.760 --> 00:06:33.260
I was sitting at the computer and Valentino
00:06:36.020 --> 00:06:36.520
was in front of a whiteboard and we were just
00:06:38.400 --> 00:06:38.900
dissecting this regex and a bunch of examples
00:06:41.680 --> 00:06:41.820
and trying to get these capture groups and
00:06:44.240 --> 00:06:44.440
stuff that we have to remap internally to get
00:06:46.560 --> 00:06:46.880
these offsets right and avoid off by 1 error
00:06:48.160 --> 00:06:48.420
and stuff like that. So yeah,
00:06:49.280 --> 00:06:49.780
definitely a team effort.
00:06:53.660 --> 00:06:54.160
[Speaker 0]: Okay, great. Moving on to the next question.
00:06:55.240 --> 00:06:55.740
What is your background in programming?
00:06:57.440 --> 00:06:57.620
Was it difficult to implement following the
00:06:59.700 --> 00:07:00.040
same API and architecture as what is already
00:07:00.200 --> 00:07:00.700
in Emacs?
00:07:05.400 --> 00:07:05.680
[Speaker 1]: So maybe just a quick back story.
00:07:06.960 --> 00:07:07.440
Both Valentino and I are actually PhD
00:07:08.300 --> 00:07:08.680
students in computer science,
00:07:09.960 --> 00:07:10.460
and we literally share an office.
00:07:12.960 --> 00:07:13.180
So that's how we even started talking about
00:07:14.480 --> 00:07:14.900
this whole thing. And we both use Emacs,
00:07:18.380 --> 00:07:18.640
of course. But I don't think this was too
00:07:20.740 --> 00:07:20.880
hard to implement because luckily all of the
00:07:22.300 --> 00:07:22.540
interactive functionality like this
00:07:23.600 --> 00:07:24.100
complicated undo, skipping,
00:07:25.680 --> 00:07:26.180
execute until the end and so on,
00:07:27.980 --> 00:07:28.380
all of this is really just already provided
00:07:29.860 --> 00:07:30.360
by the Emacs queer replace implementation.
00:07:34.160 --> 00:07:34.360
So sort of what we do is we just invoke it as
00:07:36.080 --> 00:07:36.220
a function and delegate to it.
00:07:37.800 --> 00:07:38.000
And we came up with this clever trick to
00:07:42.380 --> 00:07:42.560
basically delegate this multi-replacement to
00:07:45.160 --> 00:07:45.660
this 1 single function that's already there.
00:07:47.980 --> 00:07:48.480
So it wasn't too complicated.
00:07:54.780 --> 00:07:54.960
[Speaker 0]: Alright. And we have about 2 minutes of time
00:07:55.560 --> 00:07:56.040
for the last question.
00:07:58.040 --> 00:07:58.260
What did you learn about Emacs programming or
00:08:00.020 --> 00:08:00.100
programming in general while working on this
00:08:02.320 --> 00:08:02.820
project? A very wide question for me.
00:08:05.840 --> 00:08:06.340
[Speaker 1]: Maybe 1 thing I would like to add to the
00:08:09.220 --> 00:08:09.440
previous just answer is I don't want to say
00:08:10.160 --> 00:08:10.660
like you know we're PhDs,
00:08:12.780 --> 00:08:13.260
a PhD is required for this or anything,
00:08:15.800 --> 00:08:15.920
not at all. It's mostly just for a little bit
00:08:19.220 --> 00:08:19.720
of context, but I think obviously,
00:08:20.640 --> 00:08:21.020
even if you're not a PhD,
00:08:22.360 --> 00:08:22.540
I mean, you don't even require like
00:08:24.960 --> 00:08:25.460
university, you know, education or anything.
00:08:27.540 --> 00:08:28.040
It wasn't overly difficult to implement,
00:08:30.680 --> 00:08:31.080
sort of just read some code that's already
00:08:33.539 --> 00:08:34.039
there and you know follow what you see and
00:08:35.860 --> 00:08:36.020
poke Emacs a little bit and do a little bit
00:08:38.140 --> 00:08:38.320
of debugging on the internals and you can
00:08:40.280 --> 00:08:40.440
definitely get it. So definitely not a
00:08:42.240 --> 00:08:42.400
prerequisite to have a degree or anything to
00:08:45.480 --> 00:08:45.600
do any of this stuff. Okay so Coming back to
00:08:48.420 --> 00:08:48.560
[Speaker 0]: Yeah, I'm going to amend a little bit the
00:08:49.680 --> 00:08:49.960
question because we only have 1 minute.
00:08:51.600 --> 00:08:52.100
So just 1 thing in 10 seconds,
00:08:52.490 --> 00:08:52.540
[Speaker 2]: what did you
00:08:53.040 --> 00:08:53.540
[Speaker 0]: learn about this?
00:08:54.240 --> 00:08:54.380
[Speaker 1]: your last question. What did I learn about
00:08:56.420 --> 00:08:56.920
Emacs programming? That Emacs is so flexible
00:08:59.160 --> 00:08:59.360
that I can go and I can patch literally its
00:09:01.480 --> 00:09:01.880
message function. And that is how we achieve
00:09:03.680 --> 00:09:04.180
the nice message function in the echo buffer.
00:09:06.720 --> 00:09:06.980
So I can literally go and patch something as
00:09:07.560 --> 00:09:08.060
crucial as message.
00:09:09.920 --> 00:09:10.420
[Speaker 0]: It's great. That's a lovely 1.
00:09:12.260 --> 00:09:12.380
And I think, again, we're going back to the
00:09:13.660 --> 00:09:13.780
philosophy of Emacs. Everything is
00:09:15.200 --> 00:09:15.520
programmable and even changing the message
00:09:16.640 --> 00:09:16.800
function is great. All right,
00:09:17.440 --> 00:09:17.640
well, thank you so much,
00:09:19.540 --> 00:09:19.660
Lovro, and thanks to Valentino as well,
00:09:21.820 --> 00:09:21.960
who's not here, but who's contributed to this
00:09:23.900 --> 00:09:24.400
talk. Any last word?
00:09:29.540 --> 00:09:29.800
[Speaker 1]: Well, just if you're gonna build any
00:09:31.980 --> 00:09:32.160
solutions, try to make them as foolproof and
00:09:34.360 --> 00:09:34.540
as 100% as possible so we get more of these
00:09:36.280 --> 00:09:36.420
goodies that are nice and robust for
00:09:37.000 --> 00:09:37.500
everybody to use.
00:09:39.400 --> 00:09:39.620
[Speaker 0]: All right, lovely. Well,
00:09:40.240 --> 00:09:40.580
thank you so much, Lover,
00:09:41.940 --> 00:09:42.380
for your presentation and your answer.
00:09:44.340 --> 00:09:44.640
We'll be moving on to the next talk in just
00:09:47.260 --> 00:09:47.720
about 5 seconds, and I'll see you after.
00:09:47.900 --> 00:09:48.400
Bye, Lovro!
00:09:49.760 --> 00:09:50.260
[Speaker 1]: Yep, bye bye!
00:10:01.440 --> 00:10:01.560
[Speaker 0]: So I'm just waiting to make sure my VNC is a
00:10:02.840 --> 00:10:03.000
little slow. Okay, we switch to the next
00:10:03.480 --> 00:10:03.740
talk. All right, Lover,
00:10:04.960 --> 00:10:05.460
I'm gonna need to go get ready now.
00:10:09.060 --> 00:10:09.560
Yep. Bye-bye, and thanks for your talk.
00:10:11.160 --> 00:10:11.660
[Speaker 1]: Bye, thank you, see you.
00:10:15.060 --> 00:10:15.560
[Speaker 2]: You
|