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
|
[[!meta title="Some problems of modernizing Emacs"]]
[[!meta copyright="Copyright © 2025 Eduardo Ochs"]]
[[!inline pages="internal(2025/info/modern-nav)" raw="yes"]]
<!-- Initially generated with emacsconf-publish-talk-page and then left alone for manual editing -->
<!-- You can manually edit this file to update the abstract, add links, etc. --->
# Some problems of modernizing Emacs
Eduardo Ochs (he/him) - Pronunciation: Oks, IRC: edrx, <http://anggtwu.net/>, more info at <http://anggtwu.net/contact.html>., <mailto:eduardoochs@gmail.com>
[[!inline pages="internal(2025/info/modern-before)" raw="yes"]]
<https://anggtwu.net/emacsconf2025.html>
This talk is going to be a reworked version of the incomplete video
in <http://anggtwu.net/2025-modern.html>. I will start by presenting
several notions of "simplicity" and "elegance", and show that when I
started learning Elisp it was "simple" and "elegant" in a way that
it no longer is; then I will show how to fix some tiny parts of the
problem by 1) using functions based on \`cl-prin1', 2) redefining
some printing methods with "(cl-defmethod cl-print-object …)", and 3) using Common Lisp to understand some recent parts of Elisp that are not well-documented.
About the speaker:
Eduardo is the author of an Emacs package called eev that makes
total sense to a handful of people and no sense at all to
practically everyone else - except for one part of eev, called
"eepitch". He intends to explain the reasons for that in his talk.
## Discussion / notes
- Q: [from IRC] why the lambda representation has recently changed
to vector-like?
- A: It is easier to debug Emacs if different kinds of objects
have different types... keeping everything as lists is better
for quick-and-dirty code, but the developers wanted something
that felt less "dirty"...
- Q: Do you have hints for integrating eev into an already existing
workflow?
- A: I need to understand the other workflows to see what I can
recommend... can we discuss that on chat? If your workflow
includes Org code blocks then I will learn a lot from your
workflow too...
- I was hoping for some document with some general notes or ideas.
Right now eev feels very 'dominant'. While it works great I
find it difficult to mix eev and other Emacs tools
- Which other tools? Can we discuss examples? I was able to
integrate eev with practically all the other packages the I
know...
- Q: [from IRC] What do you think of org-mode and its executable src
blocks? That seems to overlap with what eev seemed to provide.
- A: I need to learn more about Org and source blocks!!! The
problem is that every time that I tried to learn source blocks I
started to ask many technical questions about the details and
got lost in a big maze of rabbit holes... see:
<[https://anggtwu.net/2021-org-for-non-users.html](https://anggtwu.net/2021-org-for-non-users.html)> -
I even tried to write functions that would display the data
structures behind source blocks, but at some point I gave up and
decided that I would only come back when I had people who could
help me... =(
- A: in short: when I tried to use Org mode I was always asking the wrong questions and trying to understand internal details that the developers treated as very advanced
- Q: I just tested on SBCL, Guile and Chez Scheme, and all of them use
opaque objects for functions (Chez: `#<procedure square>`, SBCL:
`#<FUNCTION F>`). Why is Emacs Lisp changing to using
semi-opaque vectors considered so bad? (Or is just making them fully
opaque better for beginners?)
- Note: on SBCL you can inspect that function object and see
both the lisp code and the machine code it compiles to
- A: It is not bad at all!
- Q: What defines `find-classtree'?
- I must confess I am still confused about eev. same with hyperbole.
- A: eev doesn't make any sense from the description and the sales blurbs, all the few people who learned it learned it from the tutorials. but that video has a big example that is very easy to run it the person has eev installed - it starts a bit after 13:00.
- I often find myself wishing other systems had a help system like Emacs.
- It took me about 5 years to move from Space & Doom to vanilla Emacs 🤣
- Now that I think about it, it was about the same for me.
- it was less about learning elisp and more about finding the motivation & internal justification to start from scratch. David Wilson's tutorials helped propel me as well
- did you switch from vim/evil bindings to "Emacs Standard" bindings?
- The Doom & Spacemacs Frameworks obfuscate how vanilla Emacs actually works... and so after a while it became a barrier
- not really, I use evil when writing code but tend to stick to vanilla bindings for most other buffers
- My own motivation was that one day Spacemacs broke an important org-mode keybinding (M-RET) in a way that I couldn't work around. I had managed to learn a decent amount of Elisp by then, so I decided to go try my first vanilla config.
- I think it took me a few months
- me similar: I use evil mode for all prose and programming buffers but Emacs modes for everything else.
- I had installed too many packages that I didn't understand at all
- I was really unhappy with performance as I started to rely more on LSP modes (this was before the bytecode implementation). Switching to vanilla & moving to Eglot really helped with that, then of course the bytecode changes make it a non-issue now
- thanks! just started using emacs about 4-5 months ago via Doom. But I can't help think I've skipped some important learnings.
- I was quite happy when I got my first taste of native compilation. It improved Elisp performance tremendously.
- I really recommend giving vanilla a try! You can use this trick to setup a parallel config so you can try it out before scrapping your current setup: https://stackoverflow.com/a/58039656/315827
- That SO strikes me as slightly more complicated that necessary.. I would usually do it inline, like: emacs -Q -eval '(setq user-emacs-directory "~/emacs.1.d")' [filename, maybe]
- There is also the --init-dir flag.
- Fair comment, with your version it could be nice to build a shell function or alias so you can have multiple configs at one time
- shell function or alias is a great idea! taking a note to set that up for myself!
- Q: following along a little using IELM... which version of Emacs was used in the recording? My (symbol-function 'foo) is giving #f(lambda (a b) [t] (+ a b))
- A: 31
- I get #[(a b) ((+ a b)) (t)] (not nil for the last vector element as shown in the presentation)
- Emacs 31 would be a development build (vs from the release branch) so it's possible two different builds of 31 could have subtle differences depending on which commit was the last included in the given builds.
- A: the demo is here
- https://anggtwu.net/2025-modern/00-try-this.html
- https://anggtwu.net/2025-modern/00-try-this
- I think that people can run the demo with just this (find-wget "https://anggtwu.net/2025-modern/00-try-this") except for one line that with give an error because it depends on a function that is not in ELPA - actually not even on the github version yet...
- if anyone has eev installed and wants to try it please tell me... I think that one line of the demo calls a function that is not in the version of eev that is ELPA yet
- Q: What do the leading red * in the left window mean?
- A: https://anggtwu.net/eepitch.html#test-blocks
- I was using eev for a month or so then my guix package broke and I am too lazy to fix it
- Very informative talk.
- Thank you edrx! eev has been on my list of things to check for some time!
- Super cool seeing pieces of the workflow with eev, gives me some ideas!
[[!inline pages="internal(2025/info/modern-after)" raw="yes"]]
[[!inline pages="internal(2025/info/modern-nav)" raw="yes"]]
|