Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
#######
#
# E-scripts on my presentation at the EmacsConf 2020.
#
# Note 1: use the eev command (defined in eev.el) and the
# ee alias (in my .zshrc) to execute parts of this file.
# Executing this file as a whole makes no sense.
# An introduction to eev can be found here:
#
#   (find-eev-quick-intro)
#   http://angg.twu.net/eev-intros/find-eev-quick-intro.html
#
# Note 2: be VERY careful and make sure you understand what
# you're doing.
#
# Note 3: If you use a shell other than zsh things like |&
# and the for loops may not work.
#
# Note 4: I always run as root.
#
# Note 5: some parts are too old and don't work anymore. Some
# never worked.
#
# Note 6: the definitions for the find-xxxfile commands are on my
# .emacs.
#
# Note 7: if you see a strange command check my .zshrc -- it may
# be defined there as a function or an alias.
#
# Note 8: the sections without dates are always older than the
# sections with dates.
#
# This file is at <http://angg.twu.net/e/emacsconf2020.e>
#           or at <http://angg.twu.net/e/emacsconf2020.e.html>.
#        See also <http://angg.twu.net/emacs.html>,
#                 <http://angg.twu.net/.emacs[.html]>,
#                 <http://angg.twu.net/.zshrc[.html]>,
#                 <http://angg.twu.net/escripts.html>,
#             and <http://angg.twu.net/>.
#
#######




# «.main-links»		(to "main-links")
# «.emacsconf2020enhp»	(to "emacsconf2020enhp")
# «.time»		(to "time")
# «.video-parts»	(to "video-parts")
# «.full-video-upload»	(to "full-video-upload")
# «.full-video»		(to "full-video")
# «.full-video-index»	(to "full-video-index")
# «.video-script»	(to "video-script")
# «.chip8»		(to "chip8")




#####
#
# main-links
# 2020nov28
#
#####

# «main-links»  (to ".main-links")
# https://emacsconf.org/2020/
# https://etherpad.wikimedia.org/p/emacsconf-2020
# https://live.emacsconf.org/
# https://live.emacsconf.org/main.html
# http://angg.twu.net/emacsconf2020.html




#####
#
# sachac's emacsconf-2020-emacs-news-highlights-preview
# 2020nov22
#
#####

# «emacsconf2020enhp»  (to ".emacsconf2020enhp")
# https://github.com/sachac/emacsconf-2020-emacs-news-highlights-preview emacsconf2020enhp
# (find-fline "~/LOGS/2020nov21.emacsconf")
# (find-es "ffmpeg" "feury-concat")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
# rm -Rfv ~/usrc/emacsconf2020enhp/
cd      ~/usrc/
git clone https://github.com/sachac/emacsconf-2020-emacs-news-highlights-preview emacsconf2020enhp
cd      ~/usrc/emacsconf2020enhp/

export PAGER=cat
git branch --list -a
git for-each-ref
git log --oneline --graph --all -20

# (find-fline "~/usrc/")
# (find-fline "~/usrc/emacsconf2020enhp/")
# (find-gitk  "~/usrc/emacsconf2020enhp/")

# (code-c-d "emacsconf2020enhp" "~/usrc/emacsconf2020enhp/")
# (find-emacsconf2020enhpfile "")

# git pull --depth 1
# git pull
# git reset
# git clean -dfx
# git reset --hard





#####
#
# time
# 2020nov28
#
#####

# «time»  (to ".time")
# https://emacsconf.org/2019
# https://emacsconf.org/2020
# https://www.timeanddate.com/worldclock/personal.html?cities=250,213,268




#####
#
# Accessing the parts of my video and building a 40-min version
# 2020nov28
#
#####

# «video-parts»  (to ".video-parts")
# (find-es "ffmpeg" "feury-concat")
# (find-fline "~/tmp/emacsconf2020/")

(code-video "ec11video" "~/tmp/emacsconf2020/ec2020-part1.1-good.mp4")
(code-video "ec12video" "~/tmp/emacsconf2020/ec2020-part1.2-good.mp4")
(code-video "ec13video" "~/tmp/emacsconf2020/ec2020-part1.3-good.mp4")
(code-video "ec14video" "~/tmp/emacsconf2020/ec2020-part1.4-good.mp4")
(code-video "ec15video" "~/tmp/emacsconf2020/ec2020-part1.5-good.mp4")
(code-video "ec2video"  "~/tmp/emacsconf2020/ec2020-part2-good.mp4")
(code-video "ec3video"  "~/tmp/emacsconf2020/ec2020-part3-good.mp4")
(code-video "ec4video"  "~/tmp/emacsconf2020/ec2020-part4-good.mp4")
;;  3:10 (find-ec11video "0:00" "M-e and M-k")
;;  6:50 (find-ec12video "0:00" "hyperlinks to external progs")
;;  4:18 (find-ec13video "0:00" "PDFs and videos")
;;  4:05 (find-ec14video "0:00" "code-c-d")
;; 10:51 (find-ec15video "0:00" "M-j")
;;  8:06 (find-ec2video "0:00" "describe-key")
;;  4:19 (find-ec3video "0:00" "killer features")
;;  5:03 (find-ec4video "0:00" "5-minute hacks")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd ~/tmp/emacsconf2020/
A=(
ec2020-part1.1-good.mp4
ec2020-part1.2-good.mp4
ec2020-part1.3-good.mp4
ec2020-part1.4-good.mp4
ec2020-part1.5-good.mp4
# ec2020-part2-good.mp4
ec2020-part3-good.mp4
ec2020-part4-good.mp4
)
rm -v ec2020.mp4
rm -v ec2020-list.txt
for i in $A; do
  echo "file '$i'" >> ec2020-list.txt
done
cat ec2020-list.txt

ffmpeg -f concat -i ec2020-list.txt -c copy ec2020.mp4




#####
#
# Building the full (47 mins) video and uploading it
# 2020nov28
#
#####

# «full-video-upload»  (to ".full-video-upload")
# (find-ssr-links "emacsconf2020" "eev2020")
# (find-eevvideo-links "eev2020" "emacsconf2020")

# (find-fline "~/tmp/emacsconf2020/")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd ~/tmp/emacsconf2020/
A=(
ec2020-part0-good.mp4
ec2020-part1.1-good.mp4
ec2020-part1.2-good.mp4
ec2020-part1.3-good.mp4
ec2020-part1.4-good.mp4
ec2020-part1.5-good.mp4
ec2020-part2-good.mp4
ec2020-part3-good.mp4
ec2020-part4-good.mp4
)
rm -v ec2020-list.txt
for i in $A; do
  echo "file '$i'" >> ec2020-list.txt
done
cat ec2020-list.txt

rm -v  emacsconf2020.mp4
ffmpeg -f concat -i ec2020-list.txt -c copy emacsconf2020.mp4
Scp-np emacsconf2020.mp4   $TWUP/eev-videos/emacsconf2020.mp4
Scp-np emacsconf2020.mp4   $TWUS/eev-videos/emacsconf2020.mp4





#####
#
# Downloading the full video
# 2020nov28
#
#####

# «full-video»        (to ".full-video")
# «full-video-index»  (to ".full-video-index")

# (find-fline "~/TH/emacsconf2020.blogme" "(find-eevvideo-links")

# http://angg.twu.net/eev-videos/
# http://angg.twu.net/eev-videos/emacsconf2020.mp4
# (find-eevvideo-links "eev2020" "emacsconf2020" "hOAqBc42Gg8" "0:00")
# (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 "10:22" "1.3. Shorter hyperlinks to PDFs and videos")
# (find-eev2020video "14:43" "1.4. How the functions that define shorter hyperlinks are implemented")
# (find-eev2020video "18:47" "1.5. M-j")
# (find-eev2020video "29:39" "2. A tale of two `describe-key's")
# (find-eev2020video "37:45" "3. Killer features")
# (find-eev2020video "42:05" "4. A tale of several \"The User\"s")
# (find-eev2020video "43:49"   "(find-emacs-tangents-links)")








#####
#
# The script that I read and executed in the video
# 2020nov29
#
#####

# «video-script»  (to ".video-script")
# https://wiki.c2.com/?PlanToThrowOneAway
# https://wiki.c2.com/?SecondSystemEffect
# https://course.ccs.neu.edu/cs5500f14/Notes/Prototyping1/planToThrowOneAway.html

* (defun big () (interactive) (set-frame-font "Monospace 12"))
*
* (eek "C-x 1")
* (toggle-frame-fullscreen)
* ; (toggle-frame-maximized)
* (size 127 56)
* (size 207 56)
* (toggle-frame-fullscreen)
* (defun big () (interactive) (set-frame-font "Monospace 16"))
*
* ; (find-angg ".emacs" "eval-print-arrow-color")
* (define-key my-mode-map (kbd "M-a") (lambda () (interactive) (end-of-line) (epac-M-E)))
* (setq ee-youtubedl-dir "~/videos/")
* (setq ee-youtubedl-dirs '("~/videos/" "~/videos/tech/" "/tmp/videos/" "/tmp/"))








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

        A presentation at the EmacsConf 2020
        November 28 and 29, 2020

          Eduardo Ochs
          http://angg.twu.net/#eev
          http://angg.twu.net/emacsconf2020.html
          http://angg.twu.net/contact.html
          https://emacsconf.org/2020/



























      ____            _     _ 
     |  _ \ __ _ _ __| |_  / |
     | |_) / _` | '__| __| | |
     |  __/ (_| | |  | |_  | |
     |_|   \__,_|_|   \__| |_|
                              
    Pre-requisites for the rest of the presentation:
    the three main keys: `M-e', `M-k', and `M-j',
    basic hyperlinks, shorter hyperlinks,
    and how to navigate the tutorials




1.1. `M-e' and `M-k'
====================

  M-e   - follow a hyperlink.
          Mnemonic: "(e)valuate"/"(e)xecute".
          Roughly equivalent to:

             C-e      ;; move-end-of-line   
             C-x C-e  ;; eval-last-sexp


  M-k   - go back.
          Mnemonic: "(k)ill buffer".
          Roughly equivalent to:

             C-x k    ;; kill-buffer


  Emacs comes with many functions that can be used as sexp hyperlinks.
  They "point" to somewhere - to the "target" of the hyperlink - and
  if we execute those sexp hyperlinks we "go to" that target. For
  example, this one,

    (man "1 cat")

  is a hyperlink that "points" to a buffer with a manpage for cat.
  Usually, but not always, after following the hyperlink we can "go
  back" by just killing the current buffer (the "target").

  The (man "1 cat") above is badly-behaved - it creates a new frame!
  To go back to the situation that we had before executing it we have
  to delete this new frame.

  Here are some examples of sexp hyperlinks using standard Emacs
  functions:

    (man "1 cat")
    (describe-key      [left])
    (describe-function 'left-char)
    (find-function     'left-char)
    (info "(emacs)Lisp Eval")
    (find-file "~/usrc/org-mode/")

  ...and their better-behaved variants:

    (find-man "1 cat")
    (find-ekeydescr      [left])
    (find-efunctiondescr 'left-char)
    (find-efunction      'left-char)
    (find-fline "~/usrc/org-mode/")
    (find-node "(emacs)Lisp Eval")
    (find-node "(emacs)Lisp Eval" "C-x C-e" "eval-last-sexp")
                                  \------------------------/
                                  This is a "pos-spec-list",
                                  that specifies a position
                                  in the target buffer.

  All my variants support `M-k' for "going back" and some support
  "pos-spec-lists". The pos-spec-list above means:

    start from the beginning of the buffer,
    search for the first occurence of "C-x C-e" after that, and then
    search for the first occurence of "eval-last-sexp" after that.




1.2. Hyperlinks that don't create new buffers
=============================================

  Some elisp hyperlinks don't create new buffers...

    result in echo area:   (find-sh0 "date")
    result in new buffer:  (find-sh  "date")

  Some invoke external programs - and they interpret
  their pos-spec-lists in different ways...

    (find-googlechrome "http://www.lua.org/start.html")

    (find-pdf-page "~/Coetzee99.pdf"  3   "LECTURE I" "[113]")
                                     \--/ \-----------------/
                                     page  comments, ignored

    (find-pdf-text "~/Coetzee99.pdf"  3   "LECTURE I" "[113]")
                                     \--/ \-----------------/
                                     page strings to search for

    (find-sh0 "cp -v ~/eev-videos/Punch_and_Judy_*.mp4 /tmp/punch_and_judy.mp4")

    (find-video "/tmp/punch_and_judy.mp4" "1:32" "1-2-3")
                                          \----/ \-----/
                                           time  comment


    Some hyperlinks work like buttons in a webpage...

      (eek "<down> C-a H E L L O ! <up> C-e")

    some "buttons" define new functions:

      (defun o () (interactive) (find-fline "~/usrc/org-mode/"))
      (o)

    Some "buttons" define functions for ***shorter hyperlinks***:

      (code-c-d "orggit" "~/usrc/org-mode/" "org")
 
           (find-orggitfile              "doc/org-guide.org")
         --> (find-fline "~/usrc/org-mode/doc/org-guide.org")

           (find-orggitnode  "HTML export commands")
         --> (find-node "(org)HTML export commands")
         -->      (info "(org)HTML export commands")




1.3. Shorter hyperlinks to PDFs and videos
==========================================

;; http://math.mit.edu/~dspivak/
;; http://math.mit.edu/~dspivak/teaching/sp18/7Sketches.pdf
(code-pdf-page "fongspivak" "~/books/__cats/fong_spivak__seven_sketches_on_compositionality.pdf")
(code-pdf-text "fongspivak" "~/books/__cats/fong_spivak__seven_sketches_on_compositionality.pdf" 12)
;; (find-fongspivakpage)
;; (find-fongspivaktext)
;; (find-fongspivakpage         8  "Contents")
;; (find-fongspivaktext         8  "Contents")
;; (find-fongspivakpage (+ 12   1) "1 Generative effects: Orders and adjunctions")
;; (find-fongspivakpage (+ 12   1) "1.1 More than the sum of their parts")
;; (find-fongspivakpage (+ 12   2) "1.1.1 A first look at generative effects")
;; (find-fongspivakpage (+ 12   5) "1.1.2 Ordering systems")
;; (find-fongspivakpage (+ 12   7) "1.2 What is order?")
;; (find-fongspivakpage (+ 12   7) "1.2.1 Review of sets, relations, and functions")
;; (find-fongspivakpage (+ 12 331) "Index")

(code-video "punchandjudyvideo" "~/eev-videos/Punch_and_Judy_Mark_Poulton-K6LmZ0A1s9U.mp4")
;; (find-punchandjudyvideo)
;; (find-punchandjudyvideo "0:00")
;; (find-punchandjudyvideo "0:10" "calls the baby")
;; (find-punchandjudyvideo "0:40" "where's the baby")
;; (find-punchandjudyvideo "1:04" "right position")
;; (find-punchandjudyvideo "1:17" "he will sing the baby to sleep")
;; (find-punchandjudyvideo "1:33" "1-2-3")
;; (find-punchandjudyvideo "1:48" "baby downstairs")
;; (find-punchandjudyvideo "3:12" "slaps")
;; (find-punchandjudyvideo "3:50" "1-2-3")
;; (find-punchandjudyvideo "4:34" "you keep an eye on mr Punch")

;; http://www.youtube.com/watch?v=NDP91RNgT4A Git in Spacemacs/Emacs with Magit
 (code-video "absminmagitvideo" "/sda5/videos/Git in Spacemacs_Emacs with Magit-NDP91RNgT4A.webm")
;; (find-absminmagitvideo)
;; (find-absminmagitvideo "0:00")
;; (find-absminmagitvideo "0:40" "with the git layer enabled")
;; (find-absminmagitvideo "0:51" "space g s -> magit-status")
;; (find-absminmagitvideo "0:58" "space g b -> magit-blame")
;; (find-absminmagitvideo "1:37" "diff")
;; (find-absminmagitvideo "2:05" "let's commit a file")
;; (find-absminmagitvideo "2:26" "visual selection")
;; (find-absminmagitvideo "5:20" "pull changes")
;; (find-absminmagitvideo "5:46" "with a nasty unmerged next to it")
;; (find-absminmagitvideo "5:59" "edit this file")
;; (find-absminmagitvideo "6:06" "new window called edit")
;; (find-absminmagitvideo "6:58" "merge local branches")
;; (find-absminmagitvideo "7:10" "git-blame")
;; (find-absminmagitvideo "7:28" "stashes")

(code-video "orglinks1video" "/sda5/videos/OrgMode E05S01 - Linking (internal)-eoIfLS4zMa8.mkv")
;; (find-orglinks1video "0:00")
;; (find-orglinks1video "5:00" "#MyID123")
;; (find-orglinks1video "7:12" "radio target: <<<Newton>>>")

(code-video "orglinks2video" "/sda5/videos/OrgMode E05S02 - Linking (external)-0TS3pTNGFIA.mp4")
;; (find-orglinks2video "0:00")
;; (find-orglinks2video "3:43" "org-id-get-create")

(code-video "orgexportvideo" "/sda5/videos/OrgMode E06S01 - Exporting-INE7n8EscvQ.mp4")
;; (find-orgexportvideo "0:00")
;; (find-orgexportvideo "0:47" "customize org-file-apps")
;; (find-orgexportvideo "1:06" "customize org-file-apps")
;; (find-orgexportvideo "2:24" "export to HTML")
;; (find-orgexportvideo "3:20" "no name target")




1.4. How the functions that define shorter hyperlinks are implemented
=====================================================================

  The standard way would be with *macros*.
  Compare this:

                              (cl-defstruct ee-glyph pos keys char face)
                (macroexpand '(cl-defstruct ee-glyph pos keys char face))
      (find-epp (macroexpand '(cl-defstruct ee-glyph pos keys char face)))
              (find-efunction 'cl-defstruct)

      (find-node "(cl)Structures" "Macro: cl-defstruct")



  ...with this. "I am a very bad programmer",     <-- (a recurring slogan here)
  so I found it easier to generate Lisp code
  as text, and then `read' and `eval' it...

           (code-c-d "orggit" "~/usrc/org-mode/" "org")
      (find-code-c-d "orggit" "~/usrc/org-mode/" "org")
      (find-efunction 'ee-code-c-d-base)


  This is explained in this part of the tutorial,

      (find-eev-quick-intro "9.1. `code-c-d'")

  except for the rationale for some design decisions,
  that we shall see soon. =)




1.5. `M-j'
==========

  1.5.1. Motivation: commands with very short names
  -------------------------------------------------
  This defun defines a "command with a very short name",
  that I can invoke with `M-x e':

    (defun e () (interactive) (find-LATEX "2020favorite-conventions.tex"))

  I create most of my LaTeX files with template-based functions.
  They create ".tex"s that start with a series of defun in comments.
  For example:

    (find-latex-links "/tmp/foo")
    -->

    % (defun c () (interactive) (find-sh "pdflatex foo.tex"))
    % (defun d () (interactive) (find-pdf-page "/tmp/foo.pdf"))
    % (defun e () (interactive) (find-fline    "/tmp/foo.tex"))
    %
    \documentclass{article}
    \begin{document}
    
    \end{document}

  Where:

    M-x c    - (c)ompile the LaTeX file that I'm working on
    M-x d    - (d)isplay it
    M-x e    - (e)dit it



  1.5.2. `M-j' itself
  -------------------
  ...or "commands with very short numbers" (!?!?)...

    M-j      - jump to certain predefined places.
               In particular,

                     M-j    - takes you to a buffer with basic help
                              and the current list of jump targets

                 M-5 M-j    - runs (find-eev-quick-intro)

                 M-2 M-j    - runs (find-emacs-keys-intro)


    (find-eev-quick-intro "That header is very beginner-friendly")

    "That header is very beginner-friendly, and if you are a beginner
     who only knows how to use `M-e' and `M-k' you can, and should,
     use that header as your main starting point: every time that you
     feel lost you can type `M-j' to go back to that header, and you
     can use its links to navigate to the documentation for Emacs and
     eev."

    "That header is followed by a section that is very beginner
     UN-friendly, that contains a series of defuns like these ones..."


    ;; Current eejump targets:

    (defun eejump-1 () (find-fline "~/TODO"))
    (defun eejump-2 () (find-emacs-keys-intro))
    (defun eejump-5 () (find-eev-quick-intro))
    (defun eejump-55 () (find-angg ".emacs"))


    Technically, what happens is this:

      (eek "M-j")
      --> (eejump nil)
      --> (find-eejumps)

      (eek "M-5 M-j")
      --> (eejump 5)
      --> (eejump-5)
      --> (find-eev-quick-intro)


    We can use `M-j' to navigate the tutorials!
    We can copy links to (points in the!) tutorials to our notes!
    Some examples:

      (find-emacs-keys-intro "1. Basic keys (eev)")
      (find-emacs-keys-intro "2. Key sequences and how to abort them")




  1.5.3. `M-J' (meta-uppercase-j)
  -------------------------------

    There is a very quick way of transforming a sexp hyperlink (or
    another sexp) into an eejump target...

      (eek "2*<down> M-J  ;; eewrap-eejump")

      6 (find-fline "~/usrc/org-mode/doc/org-guide.org")
      --> (defun eejump-6 () (find-fline "~/usrc/org-mode/doc/org-guide.org"))

    or, if the first word in the line is not a number,

      (eek "2*<down> M-J  ;; eewrap-eejump")

      og (find-fline "~/usrc/org-mode/doc/org-guide.org")
      --> (defun og () (interactive) (find-fline "~/usrc/org-mode/doc/org-guide.org"))



  1.5.4. Most `M-uppercaseletter' commands modify the current line
  ----------------------------------------------------------------

    From: (find-efunctiondescr 'eev-mode "into hyperlinks:")

    Commands to convert the current line into hyperlinks:
      M-F  -- wrap its contents in a `find-fline'
      M-M  -- wrap its contents in a `find-man'
      M-S  -- wrap its contents in a `find-sh'
      M-D  -- wrap its contents in three Debian hyperlinks
      M-J  -- make a `(defun eejump-N ...)' from N and a hyperlink
      M-T  -- generate an "* (eepitch-{xxx,kill,xxx})" block
      M-A  -- convert to two anchors pointing to one another
      M-C  -- wrap its contents in a `code-c-d' and a `find-_file'
      M-R  -- make a rm/mkdir/cd triple

    Examples:

~/usrc/org-mode/
1 cat
locate -i Edicson

  Until a few years ago these were half of my main ways to create
  sexp hyperlinks with few keystrokes...




    [end of part 1]


























      ____            _     ____  
     |  _ \ __ _ _ __| |_  |___ \ 
     | |_) / _` | '__| __|   __) |
     |  __/ (_| | |  | |_   / __/ 
     |_|   \__,_|_|   \__| |_____|
                                  
    The standard `describe-key' in Emacs is user-friendly
    but hacker-unfriendly. When I tried to complement it
    by writing a hacker-friendly version that produced
    the sexp hyperlinks that I needed I got something
    that I found really lovely - several design decisions
    of eev can be seen there - but when I showed my variant
    to people that hated it - it was totally against their
    notion of user-friendliness.


2.1. A tale of two `describe-key's
==================================

  This is the default `describe-key' from Emacs:

         (eek "C-h k <left>")
       (describe-key [left])

         (eek "C-h k <down>")
       (describe-key [down])
     (find-ekeydescr [down])

  It creates temporary buffers with "standard-looking hyperlinks"
  implemented via "buttons" - see:

    (find-efunction 'describe-key)
    (find-node "(elisp)Buttons")

  When I was a beginner using Emacs 19.34 I felt that this
  `describe-key' was "beginner-friendly" in a bad way...
  It sacrificed too much of the "hacker-friendliness" that I
  expected from it to try to be beginner-friendly.

  If we think that hyperlinks are things like this,

    <a href="TARGET">TEXT</a>

  then in the button-hyperlinks of `describe-key':

    1. it was hard to extract the "TARGET"
    2. it was hard to recreate Lisp code that would go to the TARGET
    3. it was hard to copy the full <a href="TARGET">TEXT</a>
       to other buffers - I could only copy the TEXT

  I tried to do something like this to understand what each
  button did - "did" in Lisp terms - but I had to do a lot by
  hand, as I was a beginner at the time...

     (find-ekeydescr [down])

  The button with the text "simple.el":

     (find-ekeydescr [down] ".e")
     (find-ekeydescr [down] ".e" '(push-button))
     (find-ekeydescr [down] ".e" '(eek "C-u C-x =") "help-function-def")
     (find-ekeydescr [down] ".e" '(eek "C-u C-x =") "text properties")

  The button with the text "forward-line":

     (find-ekeydescr [down] "forward-line")
     (find-ekeydescr [down] "forward-")
     (find-ekeydescr [down] "forward-" '(push-button))
     (find-ekeydescr [down] "forward-" '(eek "C-u C-x =") "help-symbol")
     (find-ekeydescr [down] "forward-" '(eek "C-u C-x =") "text properties")

  A part of (the innards of) my implementation:

     (find-function  'find-function)
     (find-efunction 'find-function)
     (find-efunction 'find-efunction)
     (find-efunction 'find-efunction "find-function-noselect")

                         (find-function-noselect 'next-line)

                         (find-function-noselect 'find-efunction)
     (find-ebufferandpos (find-function-noselect 'find-efunction))
     (find-ebufferandpos (find-function-noselect 'find-efunction) "Hyperlink to")


  So I started to try to write my own variants of `describe-key'...
  I wanted something that could complement the original `describe-key' -
  something that would produce the sexp hyperlinks that I needed.

  Again, this is the standard `describe-key',

            (eek "C-h k <left>")
          (describe-key [left])

  and this is my variant of it, `find-ekey-links',

       (find-ekey-links [left])
         (eek "M-h M-k  <left>")
         (eek "M-h M-k  <left>  ;; left-char")
  (find-elongkey-links "<left>  ;; left-char")

  and its sister function `find-elongkey-links', that expects a
  string in the kbd/read-kbd-macro syntax.

  Note that `find-ekey-links' and `find-elongkey-links' display
  temporary buffers with NO HELP, just lots of hyperlinks...
  these hyperlinks can be

    1. followed with `M-e',
    2. copied to other buffers - they're plain text!
    3. inspected, like this:
  
       (find-ekey-links [left])
       (find-ekey-links [left] 2 "describe-key-briefly")
       (find-ekey-links [left] 2 "describe-key-briefly" '(eek "C-h f"))
       (find-ekey-links [left] 2 "describe-key-briefly" '(eek "M-h M-f"))

  These lists of hyperlinks were generated by this,

    (find-efunction 'ee-find-eboundkey-links)

  that was very easy to understand and to modify


  ...and this idea of using buffers with sexp hyperlinks and no
  help VIOLATED ALL THE NOTIONS OF USER-FRIENDLINESS THAT I KNEW.







      [end of part 2]































      ____            _     _____  
     |  _ \ __ _ _ __| |_  |___ /_ 
     | |_) / _` | '__| __|   |_ (_)
     |  __/ (_| | |  | |_   ___) | 
     |_|   \__,_|_|   \__| |____(_)
      _    _ _ _              __            _                       
     | | _(_) | | ___ _ __   / _| ___  __ _| |_ _   _ _ __ ___  ___ 
     | |/ / | | |/ _ \ '__| | |_ / _ \/ _` | __| | | | '__/ _ \/ __|
     |   <| | | |  __/ |    |  _|  __/ (_| | |_| |_| | | |  __/\__ \
     |_|\_\_|_|_|\___|_|    |_|  \___|\__,_|\__|\__,_|_|  \___||___/
                                                                    
     Or: why everybody should use eev -
     or at least have it installed -
     even if they think that eev is too weird



3.1. Elisp hyperlinks
=====================

3.2. Lots of tutorials!
=======================

  The main one:

     (eek "M-5  M-j")
     (find-eev-quick-intro)

  The index:

     (eek "M-5 M-0  M-j")
     (find-eev-intro)

  If you forget everything:

     (eek "M-j")
     (find-eejumps)

  The one on (reading) Elisp:

     (find-elisp-intro)

3.3. Easy to install, and non-invasive
======================================

  (package-install 'eev)

  "To run the tutorial: install this package, then type `M-x
   eev-beginner'. This will load all the main modules, activate the
   eev-mode keybindings, and open this tutorial..."

  Toggling:

  (eev-mode 0)
  (eev-mode 1)
  (find-eev-intro "Years ago eev was a very invasive package")

3.4. High discoverability factor
================================

3.5. A way to create "hyperlinks to here"
=========================================

  (find-here-links-intro "4. `find-here-links-3'")

3.6. Hyperlinks to specific points in PDF documents and video files
===================================================================

  (find-pdf-page "~/Coetzee99.pdf" 3 "LECTURE I" "[113]")
  (find-pdf-text "~/Coetzee99.pdf" 3 "LECTURE I" "[113]")

  (find-punchandjudyvideo "1:33" "1-2-3")


3.7. A way to control shell-like programs ("eepitch")
=====================================================

  (find-eepitch-intro "1. Some demos")

  ^ My talk at the EmacsConf2019 explains this very well:
    http://angg.twu.net/emacsconf2019.html
    13:11 Let me show you an example of "executable notes and
          how to play them back".


3.8. Elisp tutorial
===================

  (find-elisp-intro)
  




     [end of part 3]











































  

      ____            _     _  _    
     |  _ \ __ _ _ __| |_  | || | _ 
     | |_) / _` | '__| __| | || |(_)
     |  __/ (_| | |  | |_  |__   _| 
     |_|   \__,_|_|   \__|    |_|(_)
      ____                  _             _         _                _        
     | ___|       _ __ ___ (_)_ __  _   _| |_ ___  | |__   __ _  ___| | _____ 
     |___ \ _____| '_ ` _ \| | '_ \| | | | __/ _ \ | '_ \ / _` |/ __| |/ / __|
      ___) |_____| | | | | | | | | | |_| | ||  __/ | | | | (_| | (__|   <\__ \
     |____/      |_| |_| |_|_|_| |_|\__,_|\__\___| |_| |_|\__,_|\___|_|\_\___/
                                                                              


4. A tale of several "The User"s
================================

  ALL of my first books on programming were FULL of programs that
  asked input from the user, like this:

    10 print "Temperature in Fahrenheit?"
    20 input F
    30 C = (F-32)*5/9
    30 print "Temperature in Celsius:", C

      (find-es "basic" "F-to-C")
      (find-ebuffer "*bwbasic*")

  These programs (sort of) suppose that someone - a "User" - is going
  to run them several times, and enter different inputs every time.

  It was only ZILLIONS of years after that i started to get books in
  which the idea of a "user" who types input was irrelevant... some
  books on C, including this one, that has the source of a small C
  compiler and a libc,

    (find-fline "~/tmp/emacsconf2020/Toolbook_of_C.jpg")
    (find-es "anatocc" "small-c-iso")
    (find-fline "/tmp/small-c/")
    (find-fline "/tmp/small-c/fprintf.c")

  this one, on writing UNIX programs ("tools") that supported files,
  pipes, and command line arguments, 

    (find-fline "~/tmp/emacsconf2020/Software_Tools.jpg")

  this one, that has an article called "Little Languages",

    (find-fline "~/tmp/emacsconf2020/More_Programming_Pearls.jpg")

  and this one, about writing programs that control other programs:

    (find-fline "~/tmp/emacsconf2020/Exploring_Expect.jpg")

  But this thing in particular blew my mind...

    (find-fline "~/tmp/emacsconf2020/HS-Forth.jpg")

  it was a commercial Forth for MS-DOS. Its editor was especially
  elegant - it was just two or three pages of code (IIRC), very easy
  to understand and to modify.















  Anyway, long story very very short:

  I switched from the belief that
  "The User" was someone else -
  someone external -
  to the belief that

    ***I AM THE USER***

  and that I could play with lots of
  interfaces that I found fun to use,
  keep the best ones,
  and then share them.

  So: eev has lots of things that are
  user-friendly in unsual ways - and
  that are user-friendly and hacker-
  friendly at the same time.

  Here is one example - one that
  really took me only about 5 minutes
  to implement:

    (find-emacs-tangents-links)

  (find-latex-links)
  (find-youtubedl-links)













# (find-fline "~/LUA/semicircle.lua")
# (find-fline "~/LUA/semicircle.lua")

  ;; (find-eepitch-intro "1. Some demos")
  ;; (find-eepitch-intro "1.2. Two targets")

  (code-video "eev2019video" "/sda5/videos/How_to_record_executable_notes_with_eev_-_and_how_to_play_them_back_short_version-86yiRG8YJD0.mp4")
  ;; (find-eev2019video)
  ;; (find-eev2019video "15:56" "If I type <f8> in these three lines here")


 (set-frame-font "Monospace Bold 9")
 (set-frame-font "Monospace Bold 10")



  Emacs





#####
#
# Wasamasa'a presentation about Chip8
# 2022sep04
#
#####

# «chip8»  (to ".chip8")
# https://emacsconf.org/2020/talks/27/
# https://depp.brause.cc/talks/emacsconf-2020/presentation.tex
# https://depp.brause.cc/chip8.el/






#  Local Variables:
#  coding:               utf-8-unix
#  modes:                (fundamental-mode emacs-lisp-mode)
#  End: