branch: externals/eev
commit 84201105b1cb885749650c32bb1e3ce240c4f164
Author: Eduardo Ochs <[email protected]>
Commit: Eduardo Ochs <[email protected]>

    New video (with subtitles): "2205badly".
---
 ChangeLog         |  46 ++++++++++++++++++
 VERSION           |   4 +-
 eepitch.el        |  21 ++++++++
 eev-blinks.el     | 142 ++++++++++++++++++++++++++++++++++++++----------------
 eev-elinks.el     |   4 +-
 eev-intro.el      | 123 ++++++++++++++++++++++++++++++++--------------
 eev-testblocks.el |  10 ++--
 eev-tlinks.el     |  50 +++++++++++++++++--
 eev-videolinks.el |  35 +++++++++++++-
 eev.el            |   2 +-
 10 files changed, 347 insertions(+), 90 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 13f0d73a95..af2485e89b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,49 @@
+2025-12-19  Eduardo Ochs  <[email protected]>
+
+       * eev.el: bumped the version.
+
+       * eev-intro.el (find-try-sly-intro): mention "2025badly".
+
+       * eev-blinks.el (ee-clprin2s, find-clprin2s): new functions.
+
+2025-12-16  Eduardo Ochs  <[email protected]>
+
+       * eev-videolinks.el (ee-1stclassvideos-info): new video, with
+       subtitles: "2025badlybt".
+
+2025-12-15  Eduardo Ochs  <[email protected]>
+
+       * eev-tlinks.el (find-sbcl-links): small changes.
+       (find-slime-sly-links): new function.
+
+       * eepitch.el (find-3ee-maxima-slime, find-4eee-maxima-slime)
+       (find-3ee-maxima-sly, find-4eee-maxima-sly): new functions.
+
+       * eev-testblocks.el (ee-insert-test-lisp-mode-4): use
+       `find-4eee-maxima-slime' and `find-3ee-maxima-slime'.
+       (ee-insert-test-lisp-mode-5): use `find-4eee-maxima-sly' and
+       `find-3ee-maxima-sly'.
+
+2025-12-10  Eduardo Ochs  <[email protected]>
+
+       * eev-intro.el (find-eev-install-intro): added the subsections
+       "5.5. With Guix" and "5.5.1. A note about read-onlyness";
+       renumbered some very old sections.
+
+2025-12-08  Eduardo Ochs  <[email protected]>
+
+       * eev-videolinks.el (ee-1stclassvideos-info): new video, with
+       subtitles: "eev2025".
+
+2025-12-06  Eduardo Ochs  <[email protected]>
+
+       * eev-blinks.el (ee-closure-to-named-plist): new function.
+       (find-clprin1, find-clprin1s, ee-clprin1, ee-clprin1s)
+       (ee-indent-as-elisp, ee-clprin2, find-clprin2, find-clprin1ind)
+       (ee-clprin1ind): Trivial changes in the code, lots of changes in
+       the comments - because these functions were used in my video for
+       the EmacsConf 2025.
+
 2025-11-23  Eduardo Ochs  <[email protected]>
 
        * eepitch.el (eepitch-b-show-source, eepitch-b-set-source)
diff --git a/VERSION b/VERSION
index 205f3664de..6272c50c96 100644
--- a/VERSION
+++ b/VERSION
@@ -1,2 +1,2 @@
-Sun Nov 23 23:05:39 GMT 2025
-Sun Nov 23 20:05:39 -03 2025
+Sat Dec 20 01:18:09 GMT 2025
+Fri Dec 19 22:18:09 -03 2025
diff --git a/eepitch.el b/eepitch.el
index c3fa594a70..73c90dfea2 100644
--- a/eepitch.el
+++ b/eepitch.el
@@ -1286,6 +1286,17 @@ raise an error."
 (defun eepitch-slime-select-pkgbuffer (pkg)
   (eepitch-to-buffer (eepitch-slime-get-pkgbuffer pkg)))
 
+;; For Maxima with Slime.
+;; Used by: (find-eev "eev-testblocks.el" "lisp-mode-maxima-slime")
+(defun find-3ee-maxima-slime ()
+  (find-3ee '(eepitch-maxima)
+           '(eepitch-slime-select-pkgbuffer "MAXIMA")))
+
+(defun find-4eee-maxima-slime ()
+  (find-4eee '(eepitch-maxima)
+            '(eepitch-slime-select-pkgbuffer "COMMON-LISP-USER")
+            '(eepitch-slime-select-pkgbuffer "MAXIMA")))
+
 
 ;; «eepitch-b-sly»  (to ".eepitch-b-sly")
 ;; This is similar to `eepitch-b-slime', for for Sly.
@@ -1313,6 +1324,16 @@ raise an error."
 (defun eepitch-sly-select-pkgbuffer (pkg)
   (eepitch-to-buffer (eepitch-sly-get-pkgbuffer pkg)))
 
+;; For Maxima with Sly.
+;; Used by: (find-eev "eev-testblocks.el" "lisp-mode-maxima-sly")
+(defun find-3ee-maxima-sly ()
+  (find-3ee '(eepitch-maxima)
+           '(eepitch-sly-select-pkgbuffer "maxima")))
+
+(defun find-4eee-maxima-sly ()
+  (find-4eee '(eepitch-maxima)
+            '(eepitch-sly-select-pkgbuffer "common-lisp-user")
+            '(eepitch-sly-select-pkgbuffer "maxima")))
 
 
 
diff --git a/eev-blinks.el b/eev-blinks.el
index 2682dc6a5e..814653ac08 100644
--- a/eev-blinks.el
+++ b/eev-blinks.el
@@ -21,7 +21,7 @@
 ;;
 ;; Author:     Eduardo Ochs <[email protected]>
 ;; Maintainer: Eduardo Ochs <[email protected]>
-;; Version:    20250831
+;; Version:    20251219
 ;; Keywords:   e-scripts
 ;;
 ;; Latest version: <http://anggtwu.net/eev-current/eev-blinks.el>
@@ -62,6 +62,7 @@
 ;; «.find-ehashtable»          (to "find-ehashtable")
 ;; «.find-estruct»             (to "find-estruct")
 ;; «.find-clprin1»             (to "find-clprin1")
+;; «.find-clprin2»             (to "find-clprin2")
 ;; «.find-sh»                  (to "find-sh")
 ;; «.find-man»                 (to "find-man")
 ;; «.find-man-bug»             (to "find-man-bug")
@@ -1157,6 +1158,10 @@ fieldname value\", like this:
 ;; For functions that use `pp-to-string', see:
 ;;   (to "find-epp")
 ;;
+;; `find-clprin1' and `find-clprin2' are mentioned in these videos:
+;;   (find-1stclassvideo-links "eev2025")
+;;   (find-1stclassvideo-links "2025modern")
+;;
 ;; Some elisp classes have special `cl-print-object' methods that tell
 ;; Emacs how to pretty-print their objects. The lower-level way of
 ;; converting objects to strings in Emacs ignore these special
@@ -1166,19 +1171,19 @@ fieldname value\", like this:
 ;;   (find-efunction 'cl-prin1-to-string)
 ;;
 ;; In this section we define the functions `find-clprin1',
-;; `find-clprin1s', `find-clprin1ind', and `find-clprin2',, that are
-;; based on `cl-prin1-to-string'. Try:
+;; `find-clprin1s', and `find-clprin2', that are based on
+;; `cl-prin1-to-string'. Try:
 ;;
-;;                          (cl-defstruct mytriple a b c)
-;;                                  (make-mytriple :a 22 :c "44")
-;;   (find-2a nil '(find-clprin1    (make-mytriple :a 22 :c "44")))
-;;   (find-2a nil '(find-clprin1ind (make-mytriple :a 22 :c "44")))
-;;                                  (cl-find-class 'cl-structure-class)
-;;   (find-2a nil '(find-clprin1ind (cl-find-class 'cl-structure-class)))
+;;                       (cl-defstruct mytriple a b c)
+;;                               (make-mytriple :a 22 :c "44")
+;;   (find-2a nil '(find-clprin1 (make-mytriple :a 22 :c "44")))
+;;   (find-2a nil '(find-clprin2 (make-mytriple :a 22 :c "44")))
+;;   (find-2a nil '(find-clprin2 (cl-find-class 'cl-structure-class)))
 ;;
-;; The `s' in `find-clprin1s' is a plural, and the `ind' in
-;; `find-clprin1ind' means "indent in a nice way". `clprin2' is an
-;; alias for `clprin1ind'.
+;; The `s' in `find-clprin1s' is a plural. I started using the suffix
+;; `clprin1ind', then switched to `clprin2' at some point; `1ind'
+;; meant "1, indented". The `*-clprin2' functions are defined and
+;; explained in the next section.
 ;;
 ;; Here are some examples of classes with special `cl-print-object'
 ;; methods:
@@ -1194,7 +1199,7 @@ fieldname value\", like this:
 ;;
 (defun find-clprin1 (o &rest pos-spec-list)
 "Visit a temporary buffer containing a `cl-prin1'-printed version of O."
-  (apply 'find-estring-elisp (cl-prin1-to-string o) pos-spec-list))
+  (apply 'find-estring-elisp (ee-clprin1 o) pos-spec-list))
 
 ;; Tests: (find-clprin1  (cl--class-slots (cl-find-class 'cl-structure-class)))
 ;;        (find-clprin1s (cl--class-slots (cl-find-class 'cl-structure-class)))
@@ -1205,29 +1210,46 @@ of objects and each one of these objects is 
`cl-prin1'-printed in a
 different line."
   (apply 'find-estring-elisp (ee-clprin1s o) pos-spec-list))
 
-;; Test: (find-clprin1ind (cl-find-class 'cl-structure-class))
-(defun find-clprin1ind (o &rest pos-spec-list)
-"Visit a temporary buffer containing a `cl-prin1'-printed version of O.
-This is a variant of `find-clprin1' that tries to insert newlines at the
-right places in the output of `cl-prin1-to-string' and then runs
-`ee-indent-as-elisp' in the result."
-  (apply 'find-estring-elisp (ee-clprin1ind o) pos-spec-list))
+;; Low-level functions used by `find-clprin1' and `find-clprin1s':
+(defun ee-clprin1  (o) (cl-prin1-to-string o))
+(defun ee-clprin1s (o) (mapconcat 'cl-prin1-to-string o "\n"))
 
-(defalias 'find-clprin2 'find-clprin1ind)
 
 
-;; Low-level functions used by `find-clprin1' and friends.
-;; I sometimes use them with `-->', the main threading macro of
-;; dash.el. For example:
-;;   (--> 'cl-structure-class cl-find-class)
-;;   (--> 'cl-structure-class cl-find-class cl-type-of)
-;;   (--> 'cl-structure-class cl-find-class cl--class-slots)
-;;   (--> 'cl-structure-class cl-find-class cl--class-slots ee-clprin1)
-;;   (--> 'cl-structure-class cl-find-class cl--class-slots ee-clprin1s)
-;;   (--> 'cl-structure-class cl-find-class ee-clprin1)
-;;   (--> 'cl-structure-class cl-find-class find-clprin1ind)
-
-;; Test: (ee-indent-as-elisp "(defun foo ()\n(interactive)\n42)")
+;;;   __ _           _            _            _       ____  
+;;;  / _(_)_ __   __| |       ___| |_ __  _ __(_)_ __ |___ \ 
+;;; | |_| | '_ \ / _` |_____ / __| | '_ \| '__| | '_ \  __) |
+;;; |  _| | | | | (_| |_____| (__| | |_) | |  | | | | |/ __/ 
+;;; |_| |_|_| |_|\__,_|      \___|_| .__/|_|  |_|_| |_|_____|
+;;;                                |_|                       
+;;
+;; «find-clprin2»  (to ".find-clprin2")
+;; `find-clprin2' is a `find-clprin1' with extra steps: it adds
+;; newlines at certain positions of the output of `cl-prin1-to-string'
+;; and runs `ee-indent-as-elisp' on the result. The newlines are added
+;; in places that make (most) "named plists" be indented nicely.
+;;
+;;   This is a plist:             (:keyA 123 :keyB 234)
+;;   This is a "named plist":  (AB :keyA 123 :keyB 234)
+;;
+;; Try:
+;;                       "(defun foo ()\n(interactive)\n42)"
+;;   (ee-indent-as-elisp "(defun foo ()\n(interactive)\n42)")
+;;                   (ee-clprin1 '(AB :keyA 123 :keyB 234))
+;;                   (ee-clprin2 '(AB :keyA 123 :keyB 234))
+;;   (find-2a nil '(find-clprin1 '(AB :keyA 123 :keyB 234)))
+;;   (find-2a nil '(find-clprin2 '(AB :keyA 123 :keyB 234)))
+;;
+;; The sexps with `*-clprin2' above will show this:
+;;
+;;   (AB
+;;    :keyA 123
+;;    :keyB 234)
+;;
+;; Here is a big example. Compare:
+;;   (find-2a nil '(find-clprin1 (cl-find-class 'cl-structure-class)))
+;;   (find-2a nil '(find-clprin2 (cl-find-class 'cl-structure-class)))
+;;
 (defun ee-indent-as-elisp (str)
   (with-temp-buffer
     (emacs-lisp-mode)
@@ -1235,21 +1257,46 @@ right places in the output of `cl-prin1-to-string' and 
then runs
     (indent-region (point-min) (point-max))
     (buffer-substring (point-min) (point-max))))
 
-(defun ee-clprin1  (o) (cl-prin1-to-string o))
-(defun ee-clprin1s (o) (mapconcat 'cl-prin1-to-string o "\n"))
-
-;; (find-estring-elisp (ee-clprin1    (cl-find-class 'cl-structure-class)))
-;; (find-estring-elisp (ee-clprin1ind (cl-find-class 'cl-structure-class)))
-(defun ee-clprin1ind (o)
+(defun ee-clprin2 (o)
   "Like `cl-prin1-to-string', but indents the result in a nice way."
-  (let* ((str1 (cl-prin1-to-string o))
+  (let* ((str1 (ee-clprin1 o))
         (str2 (replace-regexp-in-string " :"  "\n:"  str1))
         (str3 (replace-regexp-in-string " #s" "\n#s" str2))
         (str4 (replace-regexp-in-string "•[ \n]+" " " str3)) ; a hack!
         (str5 (ee-indent-as-elisp str4)))
     str5))
 
-(defalias 'ee-clprin2 'ee-clprin1ind)
+(defun ee-clprin2s (o)
+  (ee-indent-as-elisp (format "(%s)" (mapconcat 'ee-clprin2 o "\n"))))
+
+(defun find-clprin2 (o &rest pos-spec-list)
+"Visit a temporary buffer containing a `cl-prin1'-printed version of O.
+This is a variant of `find-clprin1' that tries to insert newlines at the
+right places in the output of `cl-prin1-to-string' and then runs
+`ee-indent-as-elisp' in the result."
+  (apply 'find-estring-elisp (ee-clprin2 o) pos-spec-list))
+
+;; Test: (find-clprin2s ee-1stclassvideos-info)
+(defun find-clprin2s (o &rest pos-spec-list)
+"Visit a temporary buffer containing a `cl-prin2'-printed version of O.
+This is a variant of `find-clprin2s' in which O is expected to be a list
+of objects and each one of these objects is `cl-prin2'-printed."
+  (apply 'find-estring-elisp (ee-clprin2s o) pos-spec-list))
+
+;; Some examples in "2025modern" use the old suffix...
+(defalias 'find-clprin1ind 'find-clprin2)
+(defalias   'ee-clprin1ind   'ee-clprin2)
+
+;; I sometimes use the functions above with `-->', the main threading
+;; macro of dash.el. For example:
+;;   (--> 'cl-structure-class cl-find-class)
+;;   (--> 'cl-structure-class cl-find-class cl-type-of)
+;;   (--> 'cl-structure-class cl-find-class cl--class-slots)
+;;   (--> 'cl-structure-class cl-find-class cl--class-slots ee-clprin1)
+;;   (--> 'cl-structure-class cl-find-class cl--class-slots ee-clprin1s)
+;;   (--> 'cl-structure-class cl-find-class ee-clprin1)
+;;   (--> 'cl-structure-class cl-find-class find-clprin2)
+
 
 
 
@@ -1943,6 +1990,19 @@ See the comments in the source!"
        (ee-closure-to-lambda o)
       o)))
 
+(defun ee-closure-to-named-plist (c &optional head)
+  "Convert a \"vector-like lambda\" to a \"named plist\".
+This function is used in the videos `2025modern' and `eev2025'."
+  (let ((list (ee-closure-to-list c)))
+    (seq-let [args code consts stackdepth docstring iform] list
+      `(,(or head 'interpreted-function)
+       :args       ,args
+       :code       ,code
+       :consts     ,consts
+       :stackdepth ,stackdepth
+       :docstring  ,docstring
+       :iform      ,iform))))
+
 
 
 
diff --git a/eev-elinks.el b/eev-elinks.el
index d7c30a9783..2dfcde3f26 100644
--- a/eev-elinks.el
+++ b/eev-elinks.el
@@ -1485,7 +1485,8 @@ If D is t then try to use `ee-package-dir' to get the 
directory."
 # (ee-package-dir '{pkg})
 # (find-epp        (package-get-descriptor '{pkg}))
 # (find-estruct    (package-get-descriptor '{pkg}))
-# (find-clprin1ind (package-get-descriptor '{pkg}))
+# (find-clprin2    (package-get-descriptor '{pkg}))
+# (find-clprin2s   (package-desc-extras (package-get-descriptor '0x0)))
 
 # (package-initialize)
 # (package-refresh-contents)
@@ -1495,6 +1496,7 @@ If D is t then try to use `ee-package-dir' to get the 
directory."
 # (find-fline    (ee-package-dir '{pkg}))
 # (find-epp     (ee-package-desc '{pkg}))
 # (find-estruct (ee-package-desc '{pkg}))
+# (find-clprin2 (ee-package-desc '{pkg}))
 # (kill-new      (ee-package-url '{pkg}))
 # (insert \"\\n# \" (ee-package-url '{pkg}))
 # (package-delete (ee-package-desc '{pkg}))
diff --git a/eev-intro.el b/eev-intro.el
index d1a9f5ca08..29fdefed55 100644
--- a/eev-intro.el
+++ b/eev-intro.el
@@ -19,7 +19,7 @@
 ;;
 ;; Author:     Eduardo Ochs <[email protected]>
 ;; Maintainer: Eduardo Ochs <[email protected]>
-;; Version:    20251121
+;; Version:    20251219
 ;; Keywords:   e-scripts
 ;;
 ;; Latest version: <http://anggtwu.net/eev-current/eev-intro.el>
@@ -361,7 +361,7 @@ subtitles. To learn how to use links like those, visit this 
URL:
                                (find-video-links-intro)
 
 Installing eev does NOT activate eev-mode. To activate eev-mode
-and open this tutorial, run `M-x eev-beginner'.
+and open this tutorial, and run `M-x eev-beginner'.
 
 \"Installing\" eev doesn't \"load\" eev. The difference between
 installing and loading is explained here:
@@ -2480,8 +2480,7 @@ and then execute each one with `C-e C-x C-e':
 
 
 
-
-5.2. With `package-vc-install'
+5.3. With `package-vc-install'
 ------------------------------
 This installs the version of eev that is in the git repository.
 Copy and paste these lines to an Emacs buffer, and then execute
@@ -2500,10 +2499,80 @@ This will install eev in \"~/.emacs.d/elpa/eev/\". Try:
 
 
 
+5.4. With `use-package' and straight.el
+---------------------------------------
+Some people use non-default package managers for Emacs, like
+straight.el and use-package. I have very little experience with
+them, but it SEEMS that this is a good recipe for using eev with
+`use-package':
+
+;; From:
+;; https://lists.gnu.org/archive/html/help-gnu-emacs/2021-10/msg00031.html
+;; https://lists.gnu.org/archive/html/help-gnu-emacs/2021-10/msg00034.html
+;; See: (find-eev-install-intro \"5.4. `use-package'\")
+;;
+(use-package eev
+  :straight (:host github :repo \"edrx/eev\")
+  :config (progn
+           ;; See: (find-eev \"eev-load.el\" \"autoloads\")
+           ;; https://anggtwu.net/eev-current/eev-load.el.html#autoloads
+           (require 'eev-load)
+           ;; (eev-mode 1)     ; optional
+           ;; (eev-beginner)   ; optional
+           ))
+
+
+
+5.5. With Guix
+--------------
+The author of the Guix package for eev - Untrusem - told me that
+his package is a work in progress, and that he believes that these
+instructions will start working in the middle of december/2025.
+Add this to your guix channel file:
+
+  (channel
+   (name 'rain-and-roses
+   (url \"https://codeberg.org/untrusem/rain-and-roses.git\";)
+   (branch \"trunk\"))
+
+then run this in a shell:
+
+  guix pull
+  guix install emacs-eev
+
+See the next section for some things that don't work in the Guix
+package.
+
+
+
+5.6. A note about read-onlyness
+-------------------------------
+Many functions in eev are \"documented\" by tests in comments in the
+source code. These test are marked with \";; Test:\", and they suppose
+that the person who will try to run them knows how to undo their
+actions. For example, in this section
+
+  (find-eev \"eev-blinks.el\" \"find-einsert\")
+
+two of the tests are:
+
+;; Test: (ee-insert \"\\n;; \" '(?a ?z) 32 \"Foo\")
+;; Test: (find-einsert '(\"Greek:\\n\" (913 969) 10 \"Bold:\\n\" (120276 
120327)))
+
+The first one inserts a line in the current buffer, and the way to undo
+its action is to run `undo'; the second one creates a temporary buffer,
+and the way to undo its action is to kill that buffer with `M-k'.
+
+In Guix the .el files of Emacs packages are read-only, and tests like
+the one with `ee-insert' above will fail.
+
 
-5.3. From the tarball in ELPA
+
+
+
+5.4. From the tarball in ELPA
 -----------------------------
-[This section is very old! TODO: rewrite it!]
+[Now Emacs28 is easy to install and W$, and this section is obsolete]
 
 ...as an Emacs package, by downloading a file named
 eev-YYYYMMDD.tar from either ELPA or anggtwu.net using
@@ -2530,9 +2599,9 @@ There is a link to download Emacs28-pretest here:
 
 
 
-5.1. Using the tarball
+5.5. Using the tarball
 ----------------------
-[Obsolete, deleted, except for this last paragraph:]
+[VERY obsolete, deleted, except for this last paragraph:]
 
 Every time that Emacs gets stuck into something that you don't know
 how to leave, or how to undo, you should kill the Emacs window and
@@ -2608,31 +2677,6 @@ the local copy of the .tar. See:
 
 
 
-5.5. `use-package'
-------------------
-Some people use non-default package managers for Emacs, like
-straight.el and use-package. I have very little experience with
-them, but it SEEMS that this is a good recipe for using eev with
-`use-package':
-
-;; From:
-;; https://lists.gnu.org/archive/html/help-gnu-emacs/2021-10/msg00031.html
-;; https://lists.gnu.org/archive/html/help-gnu-emacs/2021-10/msg00034.html
-;; See: (find-eev-install-intro \"5.5. `use-package'\")
-;;
-(use-package eev
-  :straight (:host github :repo \"edrx/eev\")
-  :config (progn
-           ;; See: (find-eev \"eev-load.el\" \"autoloads\")
-           ;; http://anggtwu.net/eev-current/eev-load.el.html#autoloads
-           (require 'eev-load)
-           ;; (eev-mode 1)     ; optional
-           ;; (eev-beginner)   ; optional
-           ))
-
-
-
-
 
 6. `find-eev-install-links'
 ===========================
@@ -6509,9 +6553,10 @@ scripts etc\]
 ;; Skel: (find-intro-links "eepitch")
 ;; (find-eev "eepitch.readme")
 
-(defun find-eepitch-intro (&rest rest) (interactive)
-       (let ((ee-buffer-name "*(find-eepitch-intro)*"))
-        (apply 'find-eintro "\
+(defun find-eepitch-intro (&rest rest)
+  (interactive)
+  (let ((ee-buffer-name "*(find-eepitch-intro)*"))
+    (apply 'find-eintro "\
 \(Re)generate: (find-eepitch-intro)
 Source code:  (find-eev \"eev-intro.el\" \"find-eepitch-intro\")
 More intros:  (find-eev-quick-intro)
@@ -18592,6 +18637,12 @@ Quicklisp or by Sly.
 This is rewrite of:
   (find-try-sly-links)
 
+UPDATE: in dec/2025 I recorded this video
+  (find-1stclassvideo-links \"2025badly\")
+  https://anggtwu.net/2025-badly-behaved.html
+about test blocks for Maxima, Sly, and Slime.
+TODO: integrate its ideas with this intro!
+
 
 
 
diff --git a/eev-testblocks.el b/eev-testblocks.el
index 0110d11c23..8d6e7939cb 100644
--- a/eev-testblocks.el
+++ b/eev-testblocks.el
@@ -19,7 +19,7 @@
 ;;
 ;; Author:     Eduardo Ochs <[email protected]>
 ;; Maintainer: Eduardo Ochs <[email protected]>
-;; Version:    20251123
+;; Version:    20251215
 ;; Keywords:   e-scripts
 ;;
 ;; Latest version: <http://anggtwu.net/eev-current/eev-testblocks.el>
@@ -349,7 +349,7 @@ to_lisp();
 ;; See: (find-eev "eepitch.el" "eepitch-b-slime")
 ;;      (find-angg ".maxima/startslime.lisp")
 (defun ee-insert-test-lisp-mode-4 ()
-  "Use `M-4 M-x eeit' on a Lisp mode buffer to run this."
+"For Maxima with Slime. Use `M-4 M-x eeit' on a Lisp mode buffer to run this."
   (interactive)
   (insert (ee-adjust-red-stars (format "
 #|
@@ -363,6 +363,8 @@ to_lisp();
       load(\"startslime\");
  (eepitch-b '(slime-connect \"localhost\" 4005))
  (eepitch-slime-set-pkgbuffers)
+ (find-4eee-maxima-slime)
+ (find-3ee-maxima-slime)
  (eepitch-slime-select-pkgbuffer \"COMMON-LISP-USER\")
  (eepitch-slime-select-pkgbuffer \"MAXIMA\")
 (load \"%s\")
@@ -377,7 +379,7 @@ load(\"%s\");
 ;; See: (find-eev "eepitch.el" "eepitch-b-sly")
 ;;      (find-angg ".maxima/startsly.lisp")
 (defun ee-insert-test-lisp-mode-5 ()
-  "Use `M-5 M-x eeit' on a Lisp mode buffer to run this."
+"For Maxima with Sly. Use `M-4 M-x eeit' on a Lisp mode buffer to run this."
   (interactive)
   (insert (ee-adjust-red-stars (format "
 #|
@@ -390,6 +392,8 @@ load(\"%s\");
       load(\"startsly\");
  (eepitch-b '(sly-connect \"localhost\" 56789))
  (eepitch-sly-set-pkgbuffers)
+ (find-4eee-maxima-sly)
+ (find-3ee-maxima-sly)
  (eepitch-sly-select-pkgbuffer \"common-lisp-user\")
  (eepitch-sly-select-pkgbuffer \"maxima\")
 (load \"%s\")
diff --git a/eev-tlinks.el b/eev-tlinks.el
index 142f7e9595..d4672cbeab 100644
--- a/eev-tlinks.el
+++ b/eev-tlinks.el
@@ -19,7 +19,7 @@
 ;;
 ;; Author:     Eduardo Ochs <[email protected]>
 ;; Maintainer: Eduardo Ochs <[email protected]>
-;; Version:    20251022
+;; Version:    20251215
 ;; Keywords:   e-scripts
 ;;
 ;; Latest version: <http://anggtwu.net/eev-current/eev-tlinks.el>
@@ -34,7 +34,7 @@
 
 ;; The functions defined here - `find-latex-links' and other ones -
 ;; produce buffers made of a series of hyperlinks followed by a
-;; templated text. The templated text is usually preceded by a line
+;; templated text. The templated text is often preceded by a line
 ;; like `(ee-copy-rest NLINES CODE)'; see the explanation of
 ;; `ee-copy-rest' below to understand how this is used.
 ;;
@@ -186,6 +186,7 @@
 ;; «.find-qdraw-links»                 (to "find-qdraw-links")
 ;; «.find-quicklisp-links»             (to "find-quicklisp-links")
 ;; «.find-sbcl-links»                  (to "find-sbcl-links")
+;; «.find-slime-sly-links»             (to "find-slime-sly-links")
 ;; «.find-linki-links»                 (to "find-linki-links")
 ;; «.find-gitdoc-links»                        (to "find-gitdoc-links")
 ;; «.find-luainit-links»               (to "find-luainit-links")
@@ -5598,8 +5599,13 @@ myqdraw([xr({xr}),yr({yr})], myexs());
 (apropos \"{name}\")
 (describe '{name})
 
- (eepitch-sly)
- (eepitch-kill)
+ (eepitch-slime-kill 'show-only)
+ (eepitch-slime-kill)
+ (eepitch-b '(slime \"sbcl\"))
+ (eepitch-slime-select)
+
+ (eepitch-sly-kill 'show-only)
+ (eepitch-sly-kill)
  (eepitch-sly)
 (apropos \"{name}\")
 (describe '{name})
@@ -5617,6 +5623,42 @@ myqdraw([xr({xr}),yr({yr})], myexs());
 
 
 
+;; «find-slime-sly-links»  (to ".find-slime-sly-links")
+;; Skel: (find-find-links-links-new "slime-sly" "" "")
+;; Test: (find-slime-sly-links)
+;;
+(defun find-slime-sly-links (&rest pos-spec-list)
+"Visit a temporary buffer containing hyperlinks for slime-sly."
+  (interactive)
+  (apply
+   'find-elinks-elisp
+   `((find-slime-sly-links ,@pos-spec-list)
+     ;; Convention: the first sexp always regenerates the buffer.
+     (find-efunction 'find-slime-sly-links)
+     ""
+     ,(ee-template0 "\
+;; Use the sexps below to switch between Slime and Sly.
+;; After installing the other package you need to restart Emacs.
+
+;; (find-epackage-links 'slime)
+;; (find-epackage-links 'sly)
+
+(progn
+  (package-initialize)
+  (package-refresh-contents)
+  (ignore-errors (package-delete (package-get-descriptor 'slime)))
+  (ignore-errors (package-delete (package-get-descriptor 'sly)))
+  )
+
+;;-- Choose one:
+;; (package-install 'slime)
+;; (package-install 'sly)
+
+")
+     )
+   pos-spec-list))
+
+
 
 
 ;; «find-linki-links»  (to ".find-linki-links")
diff --git a/eev-videolinks.el b/eev-videolinks.el
index 315966f2c1..12fbdd0a31 100644
--- a/eev-videolinks.el
+++ b/eev-videolinks.el
@@ -19,7 +19,7 @@
 ;;
 ;; Author:     Eduardo Ochs <[email protected]>
 ;; Maintainer: Eduardo Ochs <[email protected]>
-;; Version:    20250516
+;; Version:    20251216
 ;; Keywords:   e-scripts
 ;;
 ;; Latest version: <http://anggtwu.net/eev-current/eev-videolinks.el>
@@ -87,6 +87,8 @@
 ;;   «.eev2024»                                (to "eev2024")
 ;;   «.2024pianoroll»                  (to "2024pianoroll")
 ;;   «.2025modern»                     (to "2025modern")
+;;   «.eev2025»                                (to "eev2025")
+;;   «.2025badly»                      (to "2025badly")
 ;; «.ee-1stclassvideos-field»          (to "ee-1stclassvideos-field")
 ;; «.second-class-videos»              (to "second-class-videos")
 ;;   «.code-eevvideo»                  (to "code-eevvideo")
@@ -1025,7 +1027,7 @@ of the videos and play them with mpv. Compare with
     ;;
     ;; «2025modern»  (to ".2025modern")
     ;; Play: (find-2025modernvideo "0:00")
-    ;; Index: (find-1stclassvideoindex "2025modern")
+    ;; Subs: (find-2025modernsubs "0:00")
     ("2025modern"
      :title "Some problems of modernizing Emacs (incomplete - slides 0 to 6 
only)"
      :mp4   "http://anggtwu.net/eev-videos/2025-modern.mp4";
@@ -1036,6 +1038,35 @@ of the videos and play them with mpv. Compare with
      :length  "20:38"
      :subs    ".vtt"
      :comment "A video about vector-like lambdas, `cl-print', and buttons.")
+    ;;
+    ;; «eev2025»  (to ".eev2025")
+    ;; Play: (find-eev2025video "0:00")
+    ;; Subs: (find-eev2025hsubs "0:00")
+    ("eev2025"
+     :title "Some problems of modernizing Emacs (EmacsConf 2025)"
+     :mp4   "http://anggtwu.net/eev-videos/emacsconf2025.mp4";
+     :yt    "http://www.youtube.com/watch?v=Y75Q2IN8Y_M";
+     :page  "http://anggtwu.net/emacsconf2025.html";
+     :hsubs "http://anggtwu.net/emacsconf2025.html#0:00";
+     :date    "2025dec07"
+     :length  "25:22"
+     :subs    ".vtt"
+     :index   t
+     :comment "(to be written)")
+    ;;
+    ;; «2025badly»  (to ".2025badly")
+    ;; Play: (find-2025badlyvideo "0:00")
+    ;; Subs: (find-1stclassvideoindex "2025badly")
+    ("2025badly"
+     :title "Badly-behaved targets, or: eev, Slime, Sly, and Maxima"
+     :mp4   "http://anggtwu.net/eev-videos/2025-badly-behaved.mp4";
+     :yt    "http://www.youtube.com/watch?v=kbeHTmDBV44";
+     :page  "http://anggtwu.net/2025-badly-behaved.html";
+     :hsubs "http://anggtwu.net/2025-badly-behaved.html#0:00";
+     :date    "2025dec16"
+     :length  "17:48"
+     :subs    ".vtt"
+     :comment "A very technical video about Common Lisp and eepitch.")
     ))
 
 
diff --git a/eev.el b/eev.el
index 01d3169e82..349c2d07fb 100644
--- a/eev.el
+++ b/eev.el
@@ -6,7 +6,7 @@
 ;; Package-Requires: ((emacs "25.1"))
 ;; Keywords: lisp e-scripts
 ;; URL: http://anggtwu.net/#eev
-;; Version: 20251123
+;; Version: 20251219
 
 ;; This program is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by

Reply via email to