Quick
index
main
eev
maths
blogme
dednat6
littlelangs
PURO
(GAC2,
C3TD,
λMDetc)
(Chapa 1)

emacs
lua
(la)tex
fvwm
tcl
forth
icon
debian
irc
contact

Eev @ EmacsConf 2020

This is what I presented at the EmacsConf 2020.
Here are links to the full schedule of the conference and to my talk in it.

Title:
On why most of the best features in eev look like 5-minute hacks

Abstract:
In the last months there were several hundreds of messages in emacs-devel in threads with names like "A proposal for a friendlier Emacs", "How to make Emacs popular again", and "Interactive guide for new users". On the one hand I am absolutely sure that eev is a very good answer to all these themes; on the other hand I know that eev is based on some design decisions that offend most people used to modern, "user-friendly" interfaces - and I feel that at this moment mentions to eev in those discussions in emacs-devel would not be welcome.

In this talk I will start by presenting very quickly the main "killer features" of eev - namely:

  1. Elisp hyperlinks,
  2. interactive tutorials that can be navigated with just three keys,
  3. non-invasiveness - people can easily turn eev on for only five minutes each week, play with it a bit, and then turn it off,
  4. high discoverability factor,
  5. a way to create "hyperlinks to here",
  6. hyperlinks to specific points in PDF documents and video files - i.e., to specific pages, strings, and timemarks,
  7. a way to control shell-like programs ("eepitch"), and
  8. an Elisp tutorial,
and after that I will present the design decisions behind eev, in two parts:
  1. eev is a very thin layer above Emacs-the-Lisp-environment; it is as simple as possible, but in the sense of "simple" that was used in Forth, and that is not very familiar today.
  2. Very often when I am using Emacs - which is my main interface with the system - I realize that I can automate some task that I just did by hand twice of thrice; and that I should do that, because automating that would be both easy and fun. Over the years I experimented with several ways of automating tasks, refined some of these ways a lot, and found a certain "best" style that, again, usually offends people who are accustomed with the modern ideas of user-friendliness. In this style, used in most template-based functions in eev, both textual documentation and error-handling are kept to a minimum. I will show how, and why, eev makes this style works so well, and how users can create their own templated functions very quickly - as "5-minute hacks".


Links to some points of the video:
0:00 Title page
0:22 1.1. M-e and M-k
3:34 1.2. Hyperlinks that don't create new buffers
10:22 1.3. Shorter hyperlinks to PDFs and videos
14:43 1.4. How the functions that define shorter hyperlinks are implemented
18:47 1.5. M-j
21:02 1.5.2. M-j itself
29:39 2. A tale of two `describe-key's
32:05    inspecting text properties
37:45 3. Killer features
40:18 3.5. A way to create "hyperlinks to here"
42:05 4. A tale of several "The User"s
43:49    (find-emacs-tangents-links)

The video does not explain properly how to create "hyperlinks to here".
This is explained is these tutorials:
(find-here-links-intro)
(find-refining-intro)

This is a follow-up to my presentation at the EmacsConf 2019, whose title was:
"How to record executable notes with eev - and how to play them back".
My presentation from 2019 is more accessible, this one is more technical.

More videos:
I am recording some videos to complement this one. This first four are:
"How to install eev with `M-x list-packages' and how to navigate its tutorials"
"Some template-based functions of eev that are not five-minute hacks"
"How to create hyperlinks to "here" with `find-here-links'"
"Short videos about workflows - and how to upload them"
See:
(find-videos-intro "1. Some videos")



The video of my presentation is here:
http://angg.twu.net/eev-videos/emacsconf2020.mp4
http://www.youtube.com/watch?v=hOAqBc42Gg8
https://emacsconf.org/2020/talks/21/

If you have eev with can download and play a local copy of the video with mpv with:

;; (find-audiovideo-intro "7. `code-psnevideo'")
;; (find-audiovideo-intro "7.1. `code-eevvideo'")
;; (find-eevvideo-links "eev2020" "emacsconf2020" "hOAqBc42Gg8")
(code-video "eev2020video" "$S/http/angg.twu.net/eev-videos/emacsconf2020.mp4")
(find-eev2020video "0:00" "Title")
(find-eev2020video "0:22" "1.1. `M-e' and `M-k'")
(find-eev2020video "3:34" "1.2. Hyperlinks that don't create new buffers")
(find-eev2020video "3:47" "hyperlink to the result of running the shell command `date'")
(find-eev2020video "3:59" "result in the echo area")
(find-eev2020video "4:25" "result in a new buffer")
(find-eev2020video "4:32" "`find-googlechrome' calls an external program")
(find-eev2020video "4:52" "`find-pdf-page' calls an external program")
(find-eev2020video "5:26" "`find-pdf-text' converts the PDF to text and")
(find-eev2020video "6:25" "`find-video'")
(find-eev2020video "6:50" "hyperlinks that work like buttons")
(find-eev2020video "7:18" "`eek' executes a series of keys")
(find-eev2020video "7:45" "buttons that define new functions")
(find-eev2020video "8:20" "`code-c-d' defines several new functions at the same time")
(find-eev2020video "8:34" "the result is the name of one of the functions that is defines")
(find-eev2020video "8:45" "`find-orggitfile'")
(find-eev2020video "9:09" "prepends this string")
(find-eev2020video "9:40" "`find-orggitnode'")
(find-eev2020video "10:22" "1.3. Shorter hyperlinks to PDFs and videos")
(find-eev2020video "10:45" "`code-pdf-page' creates a short hyperlink function for a PDF")
(find-eev2020video "11:38" "let's try...")
(find-eev2020video "11:55" "`find-fongspivatext'")
(find-eev2020video "12:25" "This block is a kind of an index for that book")
(find-eev2020video "12:54" "This block is a kind of an index for that video")
(find-eev2020video "13:30" "we can index video tutorials")
(find-eev2020video "14:08" "magit-status")
(find-eev2020video "14:32" "Rainer Koenig's tutorials on org-mode")
(find-eev2020video "14:43" "1.4. How the functions that define shorter hyperlinks are implemented")
(find-eev2020video "15:34" "macroexpand")
(find-eev2020video "16:50" "Let's compare")
(find-eev2020video "17:20" "find-code-c-d shows the code that code-c-d would execute")
(find-eev2020video "18:47" "1.5. `M-j'")
(find-eev2020video "19:03" "commands with very short names")
(find-eev2020video "21:02" "1.5.2. `M-j' itself")
(find-eev2020video "21:07" "commands with very short numbers")
(find-eev2020video "21:19" "M-j jumps to predefined places")
(find-eev2020video "21:40" "M-5 M-j jumps to (find-eev-quick-intro)")
(find-eev2020video "22:13" "the part of the tutorial that explains M-j")
(find-eev2020video "22:24" "here is the header and here is the rest")
(find-eev2020video "22:35" "the header is very beginner-friendly")
(find-eev2020video "23:10" "The header has several elisp hyperlinks")
(find-eev2020video "23:39" "what the numeric prefixes do")
(find-eev2020video "25:51" "use M-j to go to the sandboxed tutorials")
(find-eev2020video "26:00" "we can copy links to the tutorials to our notes")
(find-eev2020video "26:49" "1.5.3. `M-J' (meta-uppercase-J)")
(find-eev2020video "26:58" "transforms the current line")
(find-eev2020video "27:37" "into a defun of a function with a very short name")
(find-eev2020video "28:13" "1.5.4. `M-uppercaseletter'")
(find-eev2020video "28:39" "into a link to a file")
(find-eev2020video "28:48" "into a link to a manpage")
(find-eev2020video "28:56" "into a link to the result of a shell command")
(find-eev2020video "29:39" "2. A tale of two `describe-key's")
(find-eev2020video "30:24" "the standard `describe-key'")
(find-eev2020video "30:40" "their targets are not visible")
(find-eev2020video "31:31" "the problem with the standard `describe-key'")
(find-eev2020video "32:05" "inspect text properties")
(find-eev2020video "33:50" "find-ebufferandpos")
(find-eev2020video "35:07" "My variant: `find-ekey-links'")
(find-eev2020video "37:00" "how `find-ekey-links' generates its links")
(find-eev2020video "37:14" "hacker-friendly in the way that I wanted")
(find-eev2020video "37:45" "3. Killer features")
(find-eev2020video "40:18" "3.5. A way to create \"hyperlinks to here\"")
(find-eev2020video "42:05" "4. A tale of several \"The User\"s")
(find-eev2020video "42:34" "the one that really blew my mind")
(find-eev2020video "42:44" "the user as someone external")
(find-eev2020video "43:27" "user-friendly and hacker-friendly at the same time")
(find-eev2020video "43:49" "(find-emacs-tangents-links)")
(find-eev2020video "44:25" "but I had to use a template for that")
(find-eev2020video "44:43" "but if we run this sexp here")
(find-eev2020video "45:15" "this one opens the post in the mailing list")
(find-eev2020video "45:22" "sometimes I want to Org source of that")
(find-eev2020video "45:37" "and I take this stem")
(find-eev2020video "45:47" "then I get this script that downloads the Org source")
(find-eev2020video "46:34" "this one line thing here is a hyperlink to...")

See also:
(find-es "emacsconf2020" "video-script")
(find-es "emacsconf2020" "full-video-index")


On Forth:
On simplicity in Forth:
http://angg.twu.net/miniforth-article.html#why-forth

It is possible to implement the ideas of MiniForth in Elisp,
and some of the little languages in eev are descendants of
my experiments with MiniForth. For example, the "bytecode"
from this section can be implemented as below; here the
"address" of the first DOCOL is the pair (SQUARE 0).

(setq FORTHDICT
  '((SQUARE (DOCOL DUP * EXIT))
    (CUBE   (DOCOL DUP SQUARE * EXIT))
   ))

Very few of these experiments became part of the core of eev.
For example, I implemented several control structures on
red-star lines in eepitch - and after some months I discarded
most of them... I only kept ee-copy-rest, and I reimplemented
the rest of the logic using templated functions.