[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/eev 90678b4 4/4: Merge remote-tracking branch 'eev/UTF-
From: |
Stefan Monnier |
Subject: |
[elpa] externals/eev 90678b4 4/4: Merge remote-tracking branch 'eev/UTF-8' into externals/eev |
Date: |
Tue, 13 Oct 2020 23:39:56 -0400 (EDT) |
branch: externals/eev
commit 90678b46c75a954a5962ad626290355f3fc6d539
Merge: 3f6b3ee b3eff28
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>
Merge remote-tracking branch 'eev/UTF-8' into externals/eev
---
ChangeLog | 61 +++++
VERSION | 4 +-
eejump.el | 1 +
eev-brxxx.el | 112 +++++++---
eev-elinks.el | 272 +++++++++++++++--------
eev-hlinks.el | 2 +-
eev-intro.el | 651 +++++++++++++++++++++++++++++++++++++++++-------------
eev-testblocks.el | 62 +++---
eev-tlinks.el | 346 +++++++++++++++++++----------
eev-wrap.el | 4 +
eev.el | 2 +-
11 files changed, 1076 insertions(+), 441 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 8ed98cd..7d8ee38 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,64 @@
+2020-10-13 Eduardo Ochs <eduardoochs@gmail.com>
+
+ * eev-intro.el (find-git-intro): new function.
+
+ * eev-tlinks.el (find-texlive-links): new function.
+ (find-pdflikedef-links): deleted.
+ (find-find-links-links): marked (informally) as obsolete.
+ (find-find-links-links-old): new alias.
+ (find-psne-links): use "wget -nc" by default.
+
+ * eev-brxxx.el: rewrote the comments in the beginning of the file.
+
+2020-10-12 Eduardo Ochs <eduardoochs@gmail.com>
+
+ * eev-elinks.el (find-pdflike-page-links): rewrote using
+ `find-find-links-links-new'.
+
+2020-10-10 Eduardo Ochs <eduardoochs@gmail.com>
+
+ * eev-testblocks.el (ee-insert-test-tuareg-mode): new function.
+ (ee-insert-test-idris-mode): deleted.
+
+ * eev-elinks.el (ee-package-dir): new function.
+ (ee-package-desc): new function.
+ (ee-package-findelpafiles): new function.
+ (ee-find-epackage-links0): total rewrite.
+ (find-epackage-links): total rewrite.
+
+2020-10-09 Eduardo Ochs <eduardoochs@gmail.com>
+
+ * eev-tlinks.el (find-eeit-links): new function.
+
+ * eev-intro.el (find-eepitch-intro): new section: "3.1.
+ `find-eeit-links'".
+
+2020-10-06 Eduardo Ochs <eduardoochs@gmail.com>
+
+ * eev-intro.el (find-windows-beginner-intro): added instructions
+ to run `M-x package-initialize'.
+ (find-templates-intro): added more references to
+ `find-find-links-links-new'.
+ (find-links-intro): marked as obsolete.
+ (find-eval-intro): moved the section on byte-compiled functions to
+ `(find-elisp-intro)'.
+ (find-elisp-intro): new sections: "11. Byte-compiled functions",
+ "11.1. Why eev avoids byte-compilation", and "11.2. How
+ `find-efunction' works". They were taken from `(find-eval-intro)'
+ and slightly rewritten.
+
+ * eev-tlinks.el (find-emacs-tangents-links): new function.
+ (find-intro-links): rewrote using `find-find-links-links-new'.
+
+ * eejump.el (eejump-50): new function - now `M-5 M-0 M-j' opens
+ `(find-eev-intro)'.
+
+2020-10-04 Eduardo Ochs <eduardoochs@gmail.com>
+
+ * eev-intro.el (find-eev-quick-intro): added pointers to a new
+ video to the installation instructions and deleted the pointers to
+ very old videos.
+
2020-10-02 Eduardo Ochs <eduardoochs@gmail.com>
* eev-intro.el (find-psne-intro): added two new sections, one on
diff --git a/VERSION b/VERSION
index 9b43c11..bc98dc0 100644
--- a/VERSION
+++ b/VERSION
@@ -1,2 +1,2 @@
-Sun Oct 4 09:22:54 GMT 2020
-Sun Oct 4 06:22:54 -03 2020
+Tue Oct 13 16:07:41 GMT 2020
+Tue Oct 13 13:07:41 -03 2020
diff --git a/eejump.el b/eejump.el
index 7d9440e..6aa7b52 100644
--- a/eejump.el
+++ b/eejump.el
@@ -103,6 +103,7 @@ See: (find-eejump-intro \"\\neejump\\n\")"
(defun eejump-2 () (find-emacs-keys-intro))
(defun eejump-3 () (find-windows-beginner-intro))
(defun eejump-5 () (find-eev-quick-intro))
+(defun eejump-50 () (find-eev-intro))
(defun eejump-6 () (find-escripts-intro))
(defun eejump-10 () (set-frame-font "5x7" t))
diff --git a/eev-brxxx.el b/eev-brxxx.el
index b091731..7d72d6a 100644
--- a/eev-brxxx.el
+++ b/eev-brxxx.el
@@ -19,7 +19,7 @@
;;
;; Author: Eduardo Ochs <eduardoochs@gmail.com>
;; Maintainer: Eduardo Ochs <eduardoochs@gmail.com>
-;; Version: 2019oct27
+;; Version: 2020oct12
;; Keywords: e-scripts
;;
;; Latest version: <http://angg.twu.net/eev-current/eev-brxxx.el>
@@ -34,47 +34,90 @@
;;; Commentary:
-;; See: (find-eev-quick-intro "3.1. Non-elisp hyperlinks")
-;; (find-psne-intro "Local copies")
-;; (find-brxxx-intro)
+;; The section
+;;
+;; (find-eev-quick-intro "3.1. Non-elisp hyperlinks")
+;;
+;; of the main tutorial mentions the functions `brff' and `brg', that
+;; are eev-ish variants of `browse-url'. They are explained in more
+;; details here:
+;;
+;; (find-brxxx-intro)
+;;
+;; These `brxxx's are "mass-produced" by the functions `code-brurl'
+;; and `code-brfile', that work similarly to `code-c-d'. Try these
+;; tests to see the code that they generate:
+;;
+;; (find-code-brfile 'find-FOO :local 'brFOOL :dired 'brFOOD)
+;; (find-code-brurl 'find-QUX :remote 'brQUX :local 'brQUXL :dired 'brQUXD)
+;;
+;; The first argument of `code-brurl' and `find-code-brurl' is the
+;; name of a function that expects a URL; the first argument of
+;; `code-brfile' and `find-code-brfile' is the name of a function that
+;; expects a filename. The other arguments are pairs made of a keyword
+;; and a name of a function to define.
;;
-;; The main functions here are `code-brurl' and `code-brfile', that
-;; lets us mass-define "brxxx functions" based on a given function
-;; that expects urls - in the case of `code-brurl' - or on a function
-;; that expects file names - in the case of `code-brfile'.
+;; Here is a simple test. Let's define `find-FOO' as function that
+;; expects a filename and displays it in the right window, and
+;; `find-QUX' as a function that expects a URL and displays it in the
+;; right window:
;;
-;; Try these tests to see the kind of code that is generated:
+;; (defun find-FOO (url) (find-2a nil '(find-estring url)))
+;; (defun find-QUX (fname) (find-2a nil '(find-estring fname)))
+;; (find-FOO "/tmp/a-filename")
+;; (find-QUX "http://some/url")
;;
-;; (find-code-brurl 'find-foo :remote 'brfoo :local 'brfool :dired 'brfood)
-;; (find-code-brfile 'find-bar :local 'brbarl :dired 'brbard)
+;; Now let's define the `brFOO*' and `brQUX*' functions:
;;
-;; The functions `brfoo', `brfool' and `brbarl' operate on the
-;; url-at-point, and the functions `brfood' and `brbard' operate on
-;; the file at the current line and only work in dired mode. The
-;; functions `brfool' and `brbarl' call `find-foo' and `find-bar' on
-;; the _local copy_ of the url that they receive, like this:
+;; (find-code-brfile 'find-FOO :local 'brFOOL :dired 'brFOOD)
+;; (code-brfile 'find-FOO :local 'brFOOL :dired 'brFOOD)
+;; (find-code-brurl 'find-QUX :remote 'brQUX :local 'brQUXL :dired 'brQUXD)
+;; (code-brurl 'find-QUX :remote 'brQUX :local 'brQUXL :dired 'brQUXD)
;;
-;; (brfool "http://some/url")
-;; --> (find-foo (ee-url-to-local-url "http://some/url"))
-;; --> (find-foo (concat "file://" (ee-expand "$S/http/some/url")))
+;; The function `brQUX', that was defined with `:remote', acts like
+;; `browse-url', but using `find-QUX' as its "browser": it calls
+;; `find-QUX' on a "remote" URL.
;;
-;; (brbarl "http://some/url")
-;; --> (find-bar (ee-url-to-fname "http://some/url"))
-;; --> (find-bar (ee-expand "$S/http/some/url"))
+;; The functions `brFOOL' and `brQUXL', that were defined with
+;; `:local', act on a "local copy" of the URL, in the sense of:
;;
-;; Try the sexps above with:
+;; (find-psne-intro "1. Local copies of files from the internet")
;;
-;; (defun find-foo (url) (find-2a nil '(find-estring url)))
-;; (defun find-bar (fname) (find-2a nil '(find-estring fname)))
-;; (code-brurl 'find-foo :remote 'brfoo :local 'brfool :dired 'brfood)
-;; (code-brfile 'find-bar :local 'brbarl :dired 'brbard)
+;; You can try them either by typing `M-x brFOOL' and `M-x brQUXL' on
+;; the URLs below or by running the sexps with `M-e'. Their action is
+;; to show on the right window the argument that was passed to
+;; `find-FOO' and `find-QUX':
;;
-;; The idea of local copies is explained here:
+;; (brFOOL "http://some/url")
+;; (brQUXL "http://some/url")
+;;
+;; that are that URL converted to a local file name in the first case,
+;; and that URL converted to a "file:///" URL corresponding that local
+;; file name in the second case. More precisely, what happens is:
;;
-;; (find-psne-intro "Local copies")
+;; (brFOOL "http://some/url")
+;; --> (find-FOO (ee-url-to-fname "http://some/url"))
+;; --> (find-FOO (ee-expand "$S/http/some/url"))
;;
+;; (brQUXL "http://some/url")
+;; --> (find-QUX (ee-url-to-local-url "http://some/url"))
+;; --> (find-QUX (concat "file://" (ee-expand "$S/http/some/url")))
;;
+;; The functions `brFOOD' and `brQUXD' are intended to be called
+;; interactively from dired mode. If you call them on a dired buffer
+;; showing "/tmp/" and with the point on the line that shows a file
+;; called "a-filename" their actions would be the same as the sexps
+;; below:
;;
+;; (brFOOL "/tmp/a-filename")
+;; --> (find-FOO "/tmp/a-filename")
+;;
+;; (brQUXL "/tmp/a-filename")
+;; --> (find-QUX (ee-fname-to-url "/tmp/a-filename"))
+;; --> (find-QUX (concat "file://" "/tmp/a-filename"))
+;;
+
+
;; This file, i.e.: (find-eev "eev-brxxx.el")
;; supersedes: (find-eev "eev-browse-url.el")
;; but eev-browse-url.el still has some nice comments that I would
@@ -180,7 +223,7 @@ This should be made smarter - file:// urls should be
returned unchanged."
;;; | (_| (_) | (_| | __/_____| |_) | | | |_| | | | |
;;; \___\___/ \__,_|\___| |_.__/|_| \__,_|_| |_|
;;;
-;; (find-tail-call-links "brurl" "f")
+;; Skel (broken): (find-tail-call-links "brurl" "f")
;; «code-brurl» (to ".code-brurl")
;; Test: (find-code-brurl 'find-foo :remote 'brfoo :local 'brfool :dired
'brfood)
@@ -254,12 +297,11 @@ This should be made smarter - file:// urls should be
returned unchanged."
;;; | (_| (_) | (_| | __/_____| |_) | | | _| | | __/
;;; \___\___/ \__,_|\___| |_.__/|_| |_| |_|_|\___|
;;;
-;; (find-tail-call-links "brfile" "f")
-
;; «code-brfile» (to ".code-brfile")
-;; code-brfile: top-level functions
+;; `code-brfile': top-level functions.
;;
-;; Test: (find-code-brfile 'find-bar :local 'brbarl :dired 'brbard)
+;; Skel (broken): (find-tail-call-links "brfile" "f")
+;; Test: (find-code-brfile 'find-BAR :local 'brBARL :dired 'brBARD)
;;
(defun code-brfile (f &rest rest)
"Define a family of brxxx functions from a function that operates on files"
@@ -273,7 +315,7 @@ This should be made smarter - file:// urls should be
returned unchanged."
") (ee-code-brfile-rest f rest)))
;; «ee-code-brfile-rest» (to ".ee-code-brfile-rest")
-;; Support for extra arguments
+;; `code-brfile': support for extra arguments.
(defun ee-code-brfile-rest (f rest)
(cond ((null rest) "")
diff --git a/eev-elinks.el b/eev-elinks.el
index edcd91d..0f6dc06 100644
--- a/eev-elinks.el
+++ b/eev-elinks.el
@@ -19,7 +19,7 @@
;;
;; Author: Eduardo Ochs <eduardoochs@gmail.com>
;; Maintainer: Eduardo Ochs <eduardoochs@gmail.com>
-;; Version: 2020jul22
+;; Version: 2020oct11
;; Keywords: e-scripts
;;
;; Latest version: <http://angg.twu.net/eev-current/eev-elinks.el>
@@ -76,6 +76,7 @@
;; «.find-eface-links» (to "find-eface-links")
;; «.find-color-links» (to "find-color-links")
;; «.find-epackage-links» (to "find-epackage-links")
+;; «.ee-package-dir» (to "ee-package-dir")
;; «.find-code-pdf-links» (to "find-code-pdf-links")
;; «.find-pdf-links» (to "find-pdf-links")
@@ -893,39 +894,36 @@ when this is true remove the prefix D from FNAME, and put
the sexp
;;; | |_) | (_| | _| | | < __/_____| |_) | (_| | (_| | __/
;;; | .__/ \__,_|_| |_|_|_|\_\___| | .__/ \__,_|\__, |\___|
;;; |_| |_| |___/
-
+;;
;; «find-pdflike-page-links» (to ".find-pdflike-page-links")
-;; (find-efunction 'count-lines)
+;; The function `find-pdflike-page-links' is called from
+;; `find-pdf-links' (`M-h M-p') when you call it in a buffer that is
+;; not in dired mode. See:
+;; (to "find-pdf-links")
+;; (find-pdf-like-intro "10. Generating a pair with the page number")
+;; (find-pdf-like-intro "11. How `M-h M-p' guesses everything")
;;
-(defun ee-count-formfeeds (start end)
- (save-excursion
- (save-restriction
- (narrow-to-region start end)
- (goto-char (point-min))
- (save-match-data
- (let ((done 0))
- (while (re-search-forward "[\f]" nil t 1)
- (setq done (+ 1 done)))
- done)))))
-
-(defun ee-current-page ()
- (+ 1 (ee-count-formfeeds (point-min) (point))))
-
-(defun ee-last-kill ()
- (if (stringp (car kill-ring))
- (ee-no-properties (car kill-ring))))
-
-(defun ee-region ()
- (if (region-active-p)
- (buffer-substring-no-properties (point) (mark))))
-
-(defun ee-region-or-last-kill ()
- (or (ee-region) (ee-last-kill)))
-
-;; Skel: (find-find-links-links-old "\\M-p" "pdflike-page" "page bufname
offset")
-
-;; Moved to eev-mode.el:
-;; (define-key eev-mode-map "\M-h\M-p" 'find-pdflike-page-links)
+;; Skel: (find-find-links-links-new "pdflike-page" "page bufname offset" "")
+;;
+(defun find-pdflike-page-links (&optional page bufname offset &rest
pos-spec-list)
+"Visit a temporary buffer containing hyperlinks to a pdf-like document.
+See: (find-pdf-like-intro)
+ (find-pdf-like-intro \"refining hyperlinks to pages\")"
+ (interactive)
+ (setq page (or page (ee-current-page)))
+ (setq bufname (or bufname (buffer-name)))
+ (setq offset (or offset ee-page-offset))
+ (apply
+ 'find-elinks
+ `((find-pdflike-page-links ,page ,bufname ,offset ,@pos-spec-list)
+ ;; Convention: the first sexp always regenerates the buffer.
+ (find-pdf-like-intro "10. Generating a pair with the page number")
+ (find-pdf-like-intro "11. How `M-h M-p' guesses everything")
+ ;; (find-efunction 'find-pdflike-page-links)
+ ""
+ ,@(ee-pdflike-page-links page bufname offset)
+ )
+ pos-spec-list))
(defun ee-pdflike-page-links (&optional page bufname offset)
(setq page (or page (ee-current-page)))
@@ -953,33 +951,37 @@ when this is true remove the prefix D from FNAME, and put
the sexp
,(ee-HS bufname)
)))
-(defun find-pdflike-page-links (&optional page bufname offset &rest rest)
-"Visit a temporary buffer containing hyperlinks to a pdf-like document.
-See: (find-pdf-like-intro)
- (find-pdf-like-intro \"refining hyperlinks to pages\")"
- (interactive)
- (setq page (or page (ee-current-page)))
- (setq bufname (or bufname (buffer-name)))
- (setq offset (or offset ee-page-offset))
- (apply 'find-elinks `(
- (find-pdflike-page-links ,page ,bufname ,offset ,@rest)
- ;; (find-efunction 'find-pdflike-page-links)
- ;; (find-eev-quick-intro "10.4. Generating short hyperlinks to PDFs")
- ;; (find-eev-quick-intro "11.1. `find-pdf-links'")
- (find-pdf-like-intro "10. Generating a pair with the page number")
- (find-pdf-like-intro "11. How `M-h M-p' guesses everything")
- ""
- ,@(ee-pdflike-page-links page bufname offset)
- ) rest))
+;; These are internal functions used by `find-pdflike-page-links' and
+;; `ee-pdflike-page-links'.
+
+;; Based on: (find-efunction 'count-lines)
+;;
+(defun ee-count-formfeeds (start end)
+ (save-excursion
+ (save-restriction
+ (narrow-to-region start end)
+ (goto-char (point-min))
+ (save-match-data
+ (let ((done 0))
+ (while (re-search-forward "[\f]" nil t 1)
+ (setq done (+ 1 done)))
+ done)))))
+
+(defun ee-current-page ()
+ (+ 1 (ee-count-formfeeds (point-min) (point))))
+
+(defun ee-last-kill ()
+ (if (stringp (car kill-ring))
+ (ee-no-properties (car kill-ring))))
+
+(defun ee-region ()
+ (if (region-active-p)
+ (buffer-substring-no-properties (point) (mark))))
+
+(defun ee-region-or-last-kill ()
+ (or (ee-region) (ee-last-kill)))
+
-;; (find-pdflike-page-links)
-;; (find-angg ".emacs.papers" "kopkadaly")
-;; (code-pdftotext "kopkadaly4"
"~/books/__comp/kopka_daly__a_guide_to_latex_4th_ed.pdf" 12)
-;; (find-code-pdftotext "kopkadaly4"
"~/books/__comp/kopka_daly__a_guide_to_latex_4th_ed.pdf" 12)
-;; (ee-page-parameters "kopkadaly4" 12)
-;; (find-kopkadaly4page (+ 12 287) "13.1 The picture environment")
-;; (find-kopkadaly4text "13.1 The picture environment")
-;; (find-kopkadaly4text)
@@ -1117,59 +1119,124 @@ This needs a temporary directory; see:
(find-prepared-intro)"
;;; |_| |___/
;;
;; «find-epackage-links» (to ".find-epackage-links")
-;; Skel: (find-find-links-links-new "epackage" "pkgname" "")
-;; Tests: (find-epackage-links "0x0")
-;; (find-estring (ee-find-epackage-links0 "0x0"))
-;;
-(defun find-epackage-links (&optional pkgname &rest pos-spec-list)
-"Visit a temporary buffer containing hyperlinks for an Emacs package."
- (interactive)
- (setq pkgname (or pkgname "{pkgname}"))
+;; Skel: (find-find-links-links-new "epackage" "pkg c d" "")
+;; Test: (find-epackage-links 'lua-mode)
+;; (find-epackage-links 'tetris)
+;; (find-epackage-links 'foo)
+;;
+(defun find-epackage-links (&optional pkg c d &rest pos-spec-list)
+"Visit a temporary buffer containing hyperlinks for an Emacs package.
+PKG must be a symbol; C and D are arguments for `code-c-d'.
+If D is t then try to use `ee-package-dir' to get the directory."
+ (interactive (list (symbol-at-point)))
+ (setq pkg (or pkg "{pkg}"))
+ (setq c (or c (replace-regexp-in-string "[-]" "" (symbol-name pkg))))
+ (setq d (cond ((eq d t) (ee-package-dir pkg))
+ ((eq d nil) "{d}")
+ (t d)))
(apply
'find-elinks
- `((find-epackage-links ,pkgname ,@pos-spec-list)
+ `((find-epackage-links ,(ee-add-quote pkg) ,c ,d ,@pos-spec-list)
+ (find-epackage-links ,(ee-add-quote pkg) ,c t ,@pos-spec-list)
;; Convention: the first sexp always regenerates the buffer.
(find-efunction 'find-epackage-links)
(find-elpafile "")
""
- ,(ee-find-epackage-links0 pkgname)
+ ,(ee-find-epackage-links0 pkg c d)
)
pos-spec-list))
-(defun ee-find-epackage-links0 (pkgname)
+(defun ee-find-epackage-links0 (pkg c d)
"This is an internal function used by `find-epackage-links'."
- (let* ((spkgname (format "\n %s " pkgname))
- (pattern (format "%s%s-*" ee-elpadir pkgname))
- (fnames (ee-file-expand-wildcards-slash pattern))
- (sexps (mapcar (lambda (s) (list 'find-elpafile s)) fnames))
- (sexps (reverse sexps))
- (lines (mapconcat 'ee-HS sexps "\n"))
+ (let* ((spkg (format "\n %s " pkg))
+ (findelpafiles0 (ee-package-findelpafiles pkg))
+ (findelpafiles1 (reverse findelpafiles0))
+ (findelpafiles (mapconcat 'ee-HS findelpafiles1 "\n"))
)
(ee-template0 "\
-# (find-epackages {(ee-S spkgname)})
-# (find-epackage-links '{pkgname})
-# (find-epackage '{pkgname})
-{lines}
+# (find-epackages {(ee-S spkg)})
+# (find-epackage-links '{pkg})
+# (find-epackage '{pkg})
+{findelpafiles}
-# http://elpa.gnu.org/packages/{pkgname}.html
-# http://melpa.org/#/{pkgname}
+# (ee-package-dir '{pkg})
+# (find-epp (ee-package-desc '{pkg}))
+
+# (code-c-d \"{c}\" \"{d}\")
+# (find-{c}file \"\")
+
+# http://elpa.gnu.org/packages/{pkg}.html
+# http://melpa.org/#/{pkg}
")))
-(defun ee-file-name-nondirectory-slash (fname)
- "Like `file-name-nondirectory', but appends a / to FNAME if it is a
directory.
-This is an internal function used by `ee-find-epackage-links'."
- (concat (file-name-nondirectory fname)
- (if (file-directory-p fname) "/" "")))
+
+;; Tests: (find-fline ee-elpadir)
+;; (find-fline "~/.emacs.d/elpa/" "lua-mode-")
+;; (ee-file-expand-wildcards-slash "~/.emacs.d/elpa/lua-mode-*")
+;; (ee-package-findelpafiles "lua-mode")
+;;
+(defun ee-package-findelpafiles (pkgname)
+ "Convert a PKGNAME to a list of `(find-elpafile ...)' sexps."
+ (let* ((pattern (format "%s%s-*" ee-elpadir pkgname))
+ (fnames (ee-file-expand-wildcards-slash pattern)))
+ (mapcar (lambda (s) (list 'find-elpafile s)) fnames)))
(defun ee-file-expand-wildcards-slash (pattern)
- "Like `file-expand-wildcards' but with `ee-file-name-nondirectory-slash' &
sort.
-This is an internal function used by `ee-find-epackage-links'."
+"Like `file-expand-wildcards' but with `ee-file-name-nondirectory-slash' &
sort."
(let* ((fnames0 (file-expand-wildcards pattern))
(fnames1 (mapcar 'ee-file-name-nondirectory-slash fnames0))
(fnames2 (sort fnames1 'string<)))
fnames2))
+(defun ee-file-name-nondirectory-slash (fname)
+"Like `file-name-nondirectory', but appends a / to FNAME if it is a directory."
+ (concat (file-name-nondirectory fname)
+ (if (file-directory-p fname) "/" "")))
+
+
+
+
+;; «ee-package-dir» (to ".ee-package-dir")
+;; This function converts a package name (a symbol) into the directory
+;; in which that package was installed (or nil), using functions from
+;; "package.el".
+;;
+;; Tests: (require 'package)
+;; (package-initialize)
+;; (ee-package-dir 'lua-mode)
+;; (ee-package-dir 'tetris)
+;; (ee-package-dir 'foo)
+;; (ee-package-desc 'lua-mode)
+;; (ee-package-desc 'tetris)
+;; (ee-package-desc 'foo)
+;;
+;; WARNING: the function `ee-package-dir' and its dependency
+;; `ee-package-desc' use several functions from "package.el", and I
+;; don't understand package.el well enough!
+;;
+;; See: (find-efile "emacs-lisp/package.el" "(cl-defstruct (package-desc")
+;; (find-efunction 'describe-package-1)
+;; (find-efunction 'describe-package-1 "(let* ((desc ")
+;;
+(defun ee-package-dir (pkg)
+"Convert the name of the package PKG to the directory where it was installed."
+ (let* ((desc (ee-package-desc pkg))
+ (dir (and desc (package-desc-dir desc))))
+ (if (stringp dir)
+ (replace-regexp-in-string
+ "\\([^/]\\)$" "\\1/"
+ (ee-shorten-file-name dir)))))
+
+(defun ee-package-desc (pkg)
+"An internal function used by `ee-package-dir'.
+Convert PKG - a symbol - to a package-desc structure (or to nil)."
+ (or (if (package-desc-p pkg) pkg)
+ (cadr (assq pkg package-alist))
+ (let ((built-in (assq pkg package--builtins)))
+ (if built-in
+ (package--from-builtin built-in)
+ (cadr (assq pkg package-archive-contents))))))
@@ -1186,10 +1253,8 @@ This is an internal function used by
`ee-find-epackage-links'."
;;; |_| |_|_| |_|\__,_| \___\___/ \__,_|\___| \/ |_|_|_|
|_|_|\_\___/
;;;
;; «find-code-pdf-links» (to ".find-code-pdf-links")
-;; Tests:
-;; (find-fline "/usr/local/texlive/2018/texmf-dist/doc/latex/base/")
-;; (find-code-pdf-links
"/usr/local/texlive/2018/texmf-dist/doc/latex/base/source2e.pdf")
-;; (find-code-pdf-links
"/usr/local/texlive/2018/texmf-dist/doc/latex/base/source2e.pdf" "foo")
+;; See: (to "find-pdf-links")
+;; (find-pdf-like-intro "9. Generating three pairs" "find-code-pdf-links")
;; See: (find-efunction 'ee-if-prefixp)
(defun ee-shorten-file-name (fname)
@@ -1231,7 +1296,30 @@ This is an internal function used by
`ee-find-epackage-links'."
)
pos-spec-list)))
+
+
;; «find-pdf-links» (to ".find-pdf-links")
+;; This function - usually bound to `M-h M-p' - behaves in one way
+;; when invoked from dired buffers and in a totally different way when
+;; invoked from other buffers. In a dired buffer it supposes that the
+;; current line contains the name of a PDF, and it generates a buffer
+;; whose main part is a pair `code-pdf-page'/`code-pdf-text' that lets
+;; you define short hyperlinks to that PDF. See:
+;;
+;; (find-pdf-like-intro "7. Shorter hyperlinks to PDF files")
+;; (find-pdf-like-intro "9. Generating three pairs" "`M-h M-p' in Dired
mode")
+;;
+;; When the current buffer is not in dired mode this function supposes
+;; that the buffer contains the "text" of a PDF, as explained here:
+;;
+;; (find-pdf-like-intro "3. Hyperlinks to PDF files" "find-pdf-text")
+;;
+;; and it tries to generate short hyperlinks to the current page of
+;; it, making lots of guesses, and often guessing everything wrong.
+;; See:
+;;
+;; (find-pdf-like-intro "10. Generating a pair with the page number")
+;; (find-pdf-like-intro "11. How `M-h M-p' guesses everything")
;;
(defun find-pdf-links ()
"Run either `find-code-pdf-links' or `find-pdflike-page-links'."
diff --git a/eev-hlinks.el b/eev-hlinks.el
index 30abc4a..cbe303a 100644
--- a/eev-hlinks.el
+++ b/eev-hlinks.el
@@ -275,7 +275,7 @@
(defun ee-epackage-bufferp () (ee-buffer-help ee-epackage-re 1))
(defun ee-find-epackage-links ()
(let ((p (ee-epackage-bufferp)))
- (list (ee-find-epackage-links0 p))))
+ (list (ee-find-epackage-links0 p "{c}" "{d}"))))
;; By buffer name (when the mode is man)
(defvar ee-man-re "^\\*Man \\(.*\\)\\*$")
diff --git a/eev-intro.el b/eev-intro.el
index 90fc7c5..d88a205 100644
--- a/eev-intro.el
+++ b/eev-intro.el
@@ -19,7 +19,7 @@
;;
;; Author: Eduardo Ochs <eduardoochs@gmail.com>
;; Maintainer: Eduardo Ochs <eduardoochs@gmail.com>
-;; Version: 2020oct04
+;; Version: 2020oct13
;; Keywords: e-scripts
;;
;; Latest version: <http://angg.twu.net/eev-current/eev-intro.el>
@@ -91,6 +91,7 @@
;; «.find-emacs-intro» (to "find-emacs-intro")
;; «.find-org-intro» (to "find-org-intro")
;; «.find-escripts-intro» (to "find-escripts-intro")
+;; «.find-git-intro» (to "find-git-intro")
;; «.find-windows-beginner-intro» (to "find-windows-beginner-intro")
@@ -307,7 +308,7 @@ this video (from 2016!):
http://angg.twu.net/eev-videos/video-eev-quick-0.mp4
-Open the page at
+To run it, open the page at
http://angg.twu.net/eev-intros/find-eev-quick-intro.html
@@ -2149,9 +2150,9 @@ These are the current ways to download and install eev:
links like these ones,
http://elpa.gnu.org/packages/eev.html
- http://elpa.gnu.org/packages/eev-20191003.tar
+ http://elpa.gnu.org/packages/eev-20201013.tar
http://angg.twu.net/eev-current/
- http://angg.twu.net/eev-current/eev-20191003.tar
+ http://angg.twu.net/eev-current/eev-20201013.tar
and then running `M-x package-install-file';
@@ -2446,6 +2447,7 @@ Main intros: (find-eev-quick-intro)
Index to the source files: (find-eev \"eev-load.el\")
This buffer is _temporary_ and _editable_.
It is meant as both a tutorial and a sandbox.
+The quickest way to open or recreate this is with `M-5 M-0 M-j'.
Here is a list of all the available sandbox-y tutorials that
@@ -2460,31 +2462,31 @@ recommended reading order. These are the basic ones:
5. (find-pdf-like-intro)
6. (find-eepitch-intro)
7. (find-audiovideo-intro)
- 8. (find-rcirc-intro)
- 9. (find-elisp-intro)
- 10. (find-eev-install-intro)
+ 8. (find-psne-intro)
+ 9. (find-rcirc-intro)
+ 10. (find-elisp-intro)
+ 11. (find-eev-install-intro)
This is a very basic tutorial intended mainly for M$ Windows
users:
- 11. (find-windows-beginner-intro)
+ 12. (find-windows-beginner-intro)
These ones explain ideas, conventions, and usage patterns:
- 12. (find-escripts-intro)
- 13. (find-links-conv-intro)
+ 13. (find-escripts-intro)
+ 14. (find-links-conv-intro)
These are older and more technical versions of sections of the
eev-quick-intro:
- 14. (find-eval-intro)
- 15. (find-links-intro)
- 16. (find-brxxx-intro)
- 17. (find-wrap-intro)
- 18. (find-eejump-intro)
- 19. (find-anchors-intro)
- 20. (find-code-c-d-intro)
- 21. (find-psne-intro)
+ 15. (find-eval-intro)
+ 16. (find-links-intro)
+ 17. (find-brxxx-intro)
+ 18. (find-wrap-intro)
+ 19. (find-eejump-intro)
+ 20. (find-anchors-intro)
+ 21. (find-code-c-d-intro)
These are etcs:
@@ -2492,21 +2494,22 @@ These are etcs:
23. (find-templates-intro)
24. (find-org-intro)
25. (find-videos-intro)
+ 26. (find-git-intro)
These ones explain advanced features that require extra setup:
- 26. (find-prepared-intro)
- 27. (find-bounded-intro)
- 28. (find-channels-intro)
+ 27. (find-prepared-intro)
+ 28. (find-bounded-intro)
+ 29. (find-channels-intro)
This one is used in a video:
- 29. (find-three-main-keys-intro)
+ 30. (find-three-main-keys-intro)
These ones are obsolete:
- 30. (find-emacs-intro)
- 31. (find-defun-intro)
+ 31. (find-emacs-intro)
+ 32. (find-defun-intro)
Item 25 is an index of old video tutorials, with scripts for
downloading local copies of them and links to important positions
@@ -3486,6 +3489,8 @@ are numbers or strings. Try:
7. Pos-spec-lists
=================
+[Moved to:] (find-refining-intro \"1. Pos-spec-lists\")
+
The optional arguments that refine a hyperlink form what we call
a \"pos-spec-list\". For example, the pos-spec-list here has two
elements,
@@ -3670,128 +3675,6 @@ Try:
-10.1. Byte-compiled functions
------------------------------
-Most functions in Emacs are byte-compiled - which means that
-their function cells contain a \"byte-code\" instead of a lambda
-expression. These byte-codes are very hard for humans to read.
-See:
-
- (find-elnode \"What Is a Function\" \"byte-code function\")
- (find-elnode \"Byte-Code Type\")
- (find-elnode \"Byte Compilation\")
- (find-elnode \"Disassembly\")
-
-Here is an example:
-
- (find-efunctiondescr 'find-file)
- (find-efunction 'find-file)
- (symbol-function 'find-file)
- (find-efunctionpp 'find-file)
- (find-efunctiond 'find-file)
-
-The `find-efunctionpp' link above takes the content of the
-function cell of `find-file' and \"pretty-prints\" it, i.e.,
-indents it in a nice way, but the result in this case is
-unreadable... and the `find-efunctiond' link shows a decompiled
-version of that byte-code, which is only slightly better. Both
-the `find-efunctionpp' and the `find-efunctiond' links show
-internal representations that are very different from the source
-code. Compare that with a case in which the function is not
-byte-compiled:
-
- (find-efunctiondescr 'find-fline)
- (find-efunction 'find-fline)
- (symbol-function 'find-fline)
- (find-efunctionpp 'find-fline)
-
-The `(find-efunctionpp 'find-fline)' shows a lambda expression
-that is very similar to the defun that defined `find-fline'.
-
-
-
-
-10.2. How `find-efunction' works
---------------------------------
-Eev defines hyperlink functions called `find-efunction',
-`find-evariable' and `find-eface' that are wrappers around the
-standard functions `find-function', `find-variable' and
-`find-face-definition'; the eev variants support pos-spec-lists.
-Try:
-
- (find-efunction 'find-fline)
- (find-function 'find-fline)
- (find-evariable 'ee-hyperlink-prefix)
- (find-variable 'ee-hyperlink-prefix)
- (find-eface 'eepitch-star-face)
- (find-face-definition 'eepitch-star-face)
-
-The Emacs functions are defined here:
-
- (find-efile \"emacs-lisp/find-func.el\")
-
-Their inner workings are quite complex. They use `symbol-file',
-that works on the variable `load-history'. Here are some links to
-documentation and tests:
-
- (find-efunctiondescr 'symbol-file)
- (find-elnode \"Where Defined\")
- (symbol-file 'find-fline 'defun)
- (symbol-file 'ee-hyperlink-prefix 'defvar)
- (symbol-file 'eepitch-star-face 'defface)
- (find-epp (assoc (locate-library \"eepitch\") load-history))
-
-The functions in \"find-func.el\" use `symbol-file' to find the
-file where a given symbol was defined, and then search a defun,
-defvar of defface in it that _may be_ the definition that we are
-looking for. The eev variants use the functions
-`find-function-noselect', `find-variable-noselect' and
-`find-definition-noselect' from \"find-func.el\", that return a
-pair (BUFFER . POS). Try:
-
- (find-efunctiondescr 'find-function-noselect)
- (find-efunctiondescr 'find-variable-noselect)
- (find-efunctiondescr 'find-definition-noselect)
-
- (find-ebufferandpos (find-function-noselect 'find-fline)
- )
- (find-ebufferandpos (find-variable-noselect 'ee-hyperlink-prefix)
- )
- (find-ebufferandpos (find-definition-noselect 'eepitch-star-face 'defface)
- )
-
-These `find-*-select' functions work quite well but are not 100%
-reliable - for example, if an elisp file has several definitions
-for the same function, variable, or face, the `find-*-select's
-don't know which ones were executed, neither which one was
-executed last, overriding the other ones... and it may return the
-position of a defun, defvar, or defface that is not the
-\"active\" one.
-
-
-
-
-10.3. Why eev avoids byte-compilation
--------------------------------------
-All the source files of eev have a \"no-byte-compile: t\" in
-them. See:
-
- (find-eevgrep \"grep --color -nH -e no-byte-compile: *.el\")
- (find-elnode \"Byte Compilation\" \"no-byte-compile: t\")
-
-This is non-standard, but it is a deliberate design choice.
-
-(TODO: explain the three main reasons: it is easier to teach
-emacs to beginners if they see lots of lambda expressions and few
-byte-codes; `code-c-d' and friends define functions dynamically
-and `find-efunction' don't work on them; in a distribution with
-only the \".elc\"s of eev users wouldn't have access to the
-documentation and examples in the comments of the source files.)
-
-
-
-
-
10.4. Quote and backquote
-------------------------
Eev uses backquote a lot and avoids macros.
@@ -4314,13 +4197,13 @@ It is meant as both a tutorial and a sandbox.
-Note: this intro is being rewritten!
-Ideally it should _complement_ the material in:
- (find-eev-quick-intro \"3. Elisp hyperlinks\")
-
-
-
-
+Note: this intro is obsolete!
+I need to move some parts of it to other intros and then delete it.
+ See: (find-here-links-intro)
+ (find-refining-intro)
+ (find-templates-intro)
+ (find-links-conv-intro \"3. Classification\")
+ (find-links-conv-intro \"3. Classification\" \"regenerate\")
@@ -5112,7 +4995,35 @@ function does not exist. To add support for
`FooBar-mode' to `M-x
eeit', just define a function with the right name. See the source
for examples:
- (find-eev \"eev-testblocks.el\")
+ (find-eev \"eev-testblocks.el\" \"examples\")
+
+
+
+
+3.1. `find-eeit-links'
+----------------------
+If you run this,
+
+ (find-eeit-links 'lua-mode)
+
+you will get a buffer with:
+
+ a) links to inspect the current definition of
+ `ee-insert-test-lua-mode',
+
+ b) links that let you compare that with the `ee-insert-test-'s
+ for other major modes,
+
+ c) a barebones `(defun ...)' that lets you redefine
+ `ee-insert-test-lua-mode'.
+
+If you run `find-eeit-links' interactively with `M-x' then it
+will run as:
+
+ (find-eeit-links <current-major-mode>)
+
+and you can use that to inspect the `ee-insert-test-' support for
+the current major mode, or to implement it yourself.
@@ -6499,6 +6410,15 @@ short `find-pdf'-pair. To see what it produces, try:
(find-code-pdf-links \"~/Coetzee99.pdf\")
(find-code-pdf-links \"~/Coetzee99.pdf\" \"livesofanimals\")
+The second link above produces a temporary buffer containing this:
+
+ ;; (find-pdf-page \"~/Coetzee99.pdf\")
+ ;; (find-pdf-text \"~/Coetzee99.pdf\")
+ (code-pdf-page \"livesofanimals\" \"~/Coetzee99.pdf\")
+ (code-pdf-text \"livesofanimals\" \"~/Coetzee99.pdf\")
+ ;; (find-livesofanimalspage)
+ ;; (find-livesofanimalstext)
+
`find-code-pdf-links' is somewhat similar to `find-latex-links',
in this aspect:
@@ -6647,6 +6567,11 @@ and combines it with the idea of \"local copies\" from:
(find-psne-intro \"1. Local copies of files from the internet\")
(find-psne-intro \"5. `browse-url' and friends\")
+At this moment the best explanation of these ideas in here:
+ (find-eev \"eev-brxxx.el\" \";;; Commentary:\")
+in the source code. I need to rewrite this intro!
+
+
@@ -8520,6 +8445,9 @@ It is meant as both a tutorial and a sandbox.
This intro is being rewritten!
+The prerequisites for understand this are:
+ (find-elisp-intro)
+ (find-links-conv-intro \"3. Classification\")
@@ -8559,8 +8487,7 @@ To learn how to write your own templated functions you
need to:
2) learn how to use `find-elinks' - same thing,
- 3) learn how to use `find-find-links-links', that is a horrible
- kludge that works well enough so I never cleaned it up.
+ 3) learn how to use `find-find-links-links-new'.
@@ -8690,6 +8617,9 @@ Try:
5. `find-find-links-links'
==========================
+(Note: `find-find-links-links' is obsolete, and is superseded by
+`find-find-links-links-new')
+
ALL my `find-*-links' started as quick hacks.
SOME of them were useful enough to deserve being cleaned up.
A FEW of them ended up in:
@@ -9629,6 +9559,12 @@ This buffer is _temporary_ and _editable_.
It is meant as both a tutorial and a sandbox.
+This intro is being rewritten.
+Prerequisites:
+ (find-psne-intro)
+ (find-audiovideo-intro)
+
+
1. What we have now
===================
@@ -11194,6 +11130,225 @@ This can also be used to generate links to info nodes.
+;;; ____ _ _
+;;; / ___(_) |_
+;;; | | _| | __|
+;;; | |_| | | |_
+;;; \____|_|\__|
+;;;
+;; «find-git-intro» (to ".find-git-intro")
+;; Skel: (find-intro-links "git")
+
+(defun find-git-intro (&rest pos-spec-list) (interactive)
+ (let ((ee-buffer-name "*(find-git-intro)*"))
+ (apply 'find-eintro "\
+\(Re)generate: (find-git-intro)
+Source code: (find-efunction 'find-git-intro)
+More intros: (find-eev-quick-intro)
+ (find-eev-intro)
+ (find-eepitch-intro)
+This buffer is _temporary_ and _editable_.
+It is meant as both a tutorial and a sandbox.
+
+
+
+At this moment this is a call for help -
+not an intro.
+
+
+
+
+0. Introduction
+===============
+Git is extremely popular, and I've heard that the two packages
+that attract most new users to Emacs are Org and Magit:
+
+ https://github.com/magit/magit
+ https://melpa.org/#/magit
+ (find-epackage 'magit)
+
+At this moment eev offers only a trivial hack to help people
+download git repositories. If you put the point on the github url
+above and type `M-h g' or `M-x find-git-links' you will get the
+same effect as running the sexp below:
+
+ (find-git-links \"https://github.com/magit/magit\" \"magit\")
+
+You will get a temporary buffer with an e-script for downloading
+(\"cloning\") that git repository and inspecting it in a handful
+of ways.
+
+I found git VERY hard to learn. To test most concepts you need a
+repository with tags and branches and a second repository that
+\"pulls\" from it, and no books or tutorials that I know of come
+with a sequence of commands that set that up in a way that makes
+the tests easy to reproduce. To make things worse, when I was
+trying to set up a git repository for eev on github for the first
+time I did some things wrong on the github side of the repository
+that I did not know how to undo... after spending some days
+trying to fix that I gave up, deleted that repository, created a
+new one, and decided that I would always do LOTS of local tests
+before messing up my public repository again.
+
+This intro is about doing these local tests - but it is in a VERY
+early draft.
+
+
+
+
+1. Preparation
+==============
+Download the second URL below with `M-x brep',
+
+ http://peepcode.com/products/git-internals-pdf
+
https://github.com/pluralsight/git-internals-pdf/releases/download/v2.0/peepcode-git.pdf
+
+and run this eepitch block,
+
+ (eepitch-shell)
+ (eepitch-kill)
+ (eepitch-shell)
+ rm -Rfv /tmp/git-test/
+ mkdir /tmp/git-test/
+ cd /tmp/git-test/
+ # http://angg.twu.net/bin/git-defs.html
+ wget http://angg.twu.net/bin/git-defs
+ cp -v
$S/https/github.com/pluralsight/git-internals-pdf/releases/download/v2.0/peepcode-git.pdf
.
+
+and this prog1:
+
+ (prog1
+ (code-pdf-page \"gitinternals\" \"/tmp/git-test/peepcode-git.pdf\")
+ (code-pdf-text \"gitinternals\" \"/tmp/git-test/peepcode-git.pdf\")
+ (code-c-d \"gitdoc\" \"/usr/share/doc/git-doc/\")
+ )
+
+
+
+
+2. A first repository
+=====================
+The manpage of git-revisions
+
+ (find-man \"7 git-revisions\")
+ (find-man \"7 git-revisions\" \"Here is an illustration\")
+ (find-gitdocfile \"revisions.txt\" \"illustration, by Jon Loeliger\")
+
+has this example, in which the commits have this structure:
+
+ G H I J
+ \\ / \\ /
+ D E F
+ \\ | / \\
+ \\ | / |
+ \\|/ |
+ B C
+ \\ /
+ \\ /
+ A
+
+Here is an e-script that creates it:
+
+ (eepitch-shell)
+ (eepitch-kill)
+ (eepitch-shell)
+ rm -Rfv /tmp/git-test/repo1/
+ mkdir /tmp/git-test/repo1/
+ cd /tmp/git-test/repo1/
+ . /tmp/git-test/git-defs
+ # (find-fline \"/tmp/git-test/git-defs\")
+
+ git init
+ Modify file1; Modify file2; git add file1 file2
+ Commit A; git branch brAC
+ Modify file1; Commit B; git branch brBDG
+ git checkout brAC
+ Modify file1; Commit C
+ git checkout brBDG
+ Modify file1; Commit D
+ git checkout HEAD^ -b brE
+ Modify file1; Commit E
+ git checkout HEAD^
+ git merge -s ours brAC -m F
+ git branch brFI
+ git checkout brBDG
+ Modify file1; Commit G
+ git checkout HEAD^ -b brH
+ Modify file1; Commit H
+ git checkout brFI
+ Modify file1; Commit I
+ git checkout HEAD^ -b brJ
+ Modify file1; Commit J
+ Diagram
+
+ # (find-gitk \"/tmp/git-test/repo1/\")
+
+Actually it creates the structure below - where, for example, the
+node \"G,brBDG\" is a commit with message \"G\" and a branch
+called \"brBDG\" pointing to it; I call that branch \"brBDG\"
+because when it was created it pointed to the commit with message
+\"B\", then it moved to the commit \"D\", then to \"G\".
+
+ I,brFI J,brJ
+ | /
+ G,brBDG H,brH | /
+ \\ / | /
+ D E,brE F
+ \\ | / \\
+ \\ | / |
+ \\ | / |
+ B C,brAC
+ \\ /
+ \\ /
+ A
+
+NEXT STEPS: explain how to use git merge both from the command
+line and from magit; explain HEAD, master, and tags. Point to man
+pages in man and text format and to sections in Scott Chacon's
+book. I NEED LOTS OF HELP HERE.
+
+ (find-man \"git-merge\")
+ (find-gitinternalspage)
+ (find-gitinternalstext)
+
+
+
+
+
+3. A second repository
+======================
+HELP PLEEEASEEEE
+
+
+ (eepitch-shell)
+ (eepitch-kill)
+ (eepitch-shell)
+ rm -Rfv /tmp/git-test/repo2/
+ mkdir /tmp/git-test/repo2/
+ cd /tmp/git-test/repo2/
+ . /tmp/git-test/git-defs
+ # (find-fline \"/tmp/git-test/git-defs\")
+
+ git clone /tmp/git-test/repo1/ .
+ ls -lAF
+
+ # (find-gitk \"/tmp/git-test/repo2/\")
+ # (find-fline \"/tmp/git-test/repo2/\")
+ # (find-fline \"/tmp/git-test/repo2/.git/\")
+ # (find-fline \"/tmp/git-test/repo2/.git/config\")
+
+ # (find-man \"1 git-remote\")
+ # (find-progitpage (+ 24 36) \"Adding Remote Repositories\")
+ # (find-progittext (+ 24 36) \"Adding Remote Repositories\")
+
+" pos-spec-list)))
+
+;; (find-git-intro)
+
+
+
+
+
;;; __ ___ _ _
;;; \ \ / / | | |__ ___ __ _(_)_ __ _ __ ___ _ __
@@ -11356,9 +11511,10 @@ of the screen as a \"minibuffer\" - see:
(find-enode \"M-x\" \"Running Commands by Name\")
To install eev,
- 1. run `M-x list-packages',
- 2. select \"eev\" at the list of packages,
- 3. click on \"install\".
+ 1. run `M-x package-initialize',
+ 2. run `M-x list-packages',
+ 3. select \"eev\" at the list of packages,
+ 4. click on \"install\".
To load eev and enter its tutorial, run
`M-x eev-beginner'.
@@ -12273,6 +12429,183 @@ They are the hardest ones to read in the eev source.
+
+11. Byte-compiled functions
+===========================
+Most functions in Emacs are byte-compiled - which means that
+their function cells contain a \"byte-code\" instead of a lambda
+expression. These byte-codes are very hard for humans to read.
+See:
+
+ (find-elnode \"What Is a Function\" \"byte-code function\")
+ (find-elnode \"Byte-Code Type\")
+ (find-elnode \"Byte Compilation\")
+ (find-elnode \"Disassembly\")
+
+Here is an example:
+
+ (find-efunctiondescr 'find-file)
+ (find-efunction 'find-file)
+ (symbol-function 'find-file)
+ (find-efunctionpp 'find-file)
+ (find-efunctiond 'find-file)
+
+The `find-efunctionpp' link above takes the content of the
+function cell of `find-file' and \"pretty-prints\" it, i.e.,
+indents it in a nice way, but the result in this case is
+unreadable... and the `find-efunctiond' link shows a decompiled
+version of that byte-code, which is only slightly better. Both
+the `find-efunctionpp' and the `find-efunctiond' links show
+internal representations that are very different from the source
+code. Compare that with a case in which the function is not
+byte-compiled:
+
+ (find-efunctiondescr 'find-fline)
+ (find-efunction 'find-fline)
+ (symbol-function 'find-fline)
+ (find-efunctionpp 'find-fline)
+
+The `(find-efunctionpp 'find-fline)' shows a lambda expression
+that is very similar to the defun that defined `find-fline'.
+
+
+
+
+
+11.1. Why eev avoids byte-compilation
+-------------------------------------
+All the source files of eev have a \"no-byte-compile: t\" in
+them. See:
+
+ (find-eevgrep \"grep --color -nH -e no-byte-compile: *.el\")
+ (find-elnode \"Byte Compilation\" \"no-byte-compile: t\")
+ (find-enode \"Specifying File Variables\")
+
+This `no-byte-compile: t' is non-standard, but it is a deliberate
+design choice. I tried to make eev as beginner-friendly as
+possible, and beginners find byte-compiled functions confusing,
+so I avoided them as much as possible. Remember that several
+functions in eev define other functions - for example:
+
+ (find-eev-quick-intro \"9.1. `code-c-d'\")
+ (find-eev-quick-intro \"9.1. `code-c-d'\" \"mass-produced\")
+ (find-eev-quick-intro \"9.1. `code-c-d'\" \"find-code-c-d\")
+
+and if you try to understand what a hyperlink function like one
+below does by typing `M-h M-f' on it,
+
+ (find-efile \"subr.el\")
+
+then the `find-efunction' link in the `M-h M-f' buffer will not
+work - but the `find-efunctionpp' link will. Try:
+
+ (find-efunction 'find-efile)
+ (find-efunctionpp 'find-efile)
+
+
+
+
+
+11.2. How `find-efunction' works
+--------------------------------
+Eev defines hyperlink functions called `find-efunction',
+`find-evariable' and `find-eface' that are wrappers around the
+standard Emacs functions `find-function', `find-variable' and
+`find-face-definition'; the eev variants support pos-spec-lists.
+Try:
+
+ (find-efunction 'find-fline)
+ (find-function 'find-fline)
+ (find-evariable 'ee-hyperlink-prefix)
+ (find-variable 'ee-hyperlink-prefix)
+ (find-eface 'eepitch-star-face)
+ (find-face-definition 'eepitch-star-face)
+
+The Emacs functions are defined here:
+
+ (find-efile \"emacs-lisp/find-func.el\")
+
+and their inner workings are quite complex. To begin with, hey
+use `symbol-file', that works on the variable `load-history'.
+Here are some links to documentation and tests:
+
+ (find-efunctiondescr 'symbol-file)
+ (find-elnode \"Where Defined\")
+ (symbol-file 'find-fline 'defun)
+ (symbol-file 'find-efile 'defun)
+ (symbol-file 'ee-hyperlink-prefix 'defvar)
+ (symbol-file 'eepitch-star-face 'defface)
+ (find-eloadhistory \"eepitch\")
+ (find-eloadhistory \"eepitch\" \"eepitch-star-face\")
+
+The functions in \"find-func.el\" use `symbol-file' to find the
+file where a given symbol was defined, and then search for a
+defun, defvar of defface in it that _looks like_ the definition
+that we are looking for.
+
+Emacs knows that `find-efile' was defined in \"eev-code.el\",
+because of:
+
+ (symbol-file 'find-efile 'defun)
+ (find-eloadhistory \"eev-code\" \"find-efile\")
+
+but if we run
+
+ (find-function 'find-efile)
+
+this will fail, because Emacs will look for something like
+\"(defun find-efile \" in \"eev-code.el\", and it will not find
+it; it doesn't know that `find-efile' was defined by this
+`code-c-d':
+
+ (find-eev \"eev-code.el\" \"code-c-d-s\")
+ (find-eev \"eev-code.el\" \"code-c-d-s\" \"\\\"e\\\"\")
+
+Let's be even more precise. \"find-func.el\" defines these
+low-level functions,
+
+ (find-efunctiondescr 'find-function-noselect)
+ (find-efunctiondescr 'find-variable-noselect)
+ (find-efunctiondescr 'find-definition-noselect)
+
+that return structures of the form (BUFFER . POS), and eev
+defines a function
+
+ (find-efunctiondescr 'find-ebufferandpos)
+ (find-efunction 'find-ebufferandpos)
+
+that jumps to a (BUFFER . POS); `find-efunction' and friends are
+implemented using `find-ebufferandpos'. Try:
+
+ (find-ebufferandpos
+ (find-function-noselect 'find-fline)
+ )
+ (find-ebufferandpos
+ (find-variable-noselect 'ee-hyperlink-prefix)
+ )
+ (find-ebufferandpos
+ (find-definition-noselect 'eepitch-star-face 'defface)
+ )
+
+These `find-*-noselect' functions work quite well but are not
+100% reliable - for example, if an elisp file has several
+definitions for the same function, variable, or face, the
+`find-*-noselect's don't know which ones were executed, neither
+which one was executed last, overriding the other ones... and it
+may return the position of a defun, defvar, or defface that is
+not the \"active\" one. In eev redefinitions like these ones
+
+ (code-pdf-page \"foomanual\" \"/usr/src/foo-1.2.3/manual.pdf\")
+ (code-pdf-page \"foomanual\" \"/usr/src/foo-1.2.4/manual.pdf\")
+
+are quite common, and
+
+ (find-efunctionpp 'find-foomanualpage)
+
+will give you information about the current definition.
+
+
+
" pos-spec-list)))
;; (find-elisp-intro)
diff --git a/eev-testblocks.el b/eev-testblocks.el
index c95f213..cff3d9c 100644
--- a/eev-testblocks.el
+++ b/eev-testblocks.el
@@ -19,7 +19,7 @@
;;
;; Author: Eduardo Ochs <eduardoochs@gmail.com>
;; Maintainer: Eduardo Ochs <eduardoochs@gmail.com>
-;; Version: 2020aug05
+;; Version: 2020oct10
;; Keywords: e-scripts
;;
;; Latest version: <http://angg.twu.net/eev-current/eev-testblocks.el>
@@ -36,6 +36,12 @@
;; interactive tests. See:
;;
;; (find-eepitch-intro "3. Test blocks")
+;; (find-eepitch-intro "3.1. `find-eeit-links'")
+
+
+;; «.ee-insert-test» (to "ee-insert-test")
+;; «.examples» (to "examples")
+
@@ -60,20 +66,28 @@
(funcall (intern (format "ee-insert-test-%s" major-mode)))
(error "ee-insert-test: Unsupported major mode: %s" major-mode)))
-;; The old definition was:
+
+;;; _
+;;; _____ ____ _ _ __ ___ _ __ | | ___ ___
+;;; / _ \ \/ / _` | '_ ` _ \| '_ \| |/ _ \/ __|
+;;; | __/> < (_| | | | | | | |_) | | __/\__ \
+;;; \___/_/\_\__,_|_| |_| |_| .__/|_|\___||___/
+;;; |_|
;;
-;; (defun ee-insert-test ()
-;; "Insert a \"test block\" - an eepitch block in a multiline comment."
-;; (interactive)
-;; (cond ((eq major-mode 'lua-mode) (ee-insert-test-lua))
-;; ((eq major-mode 'python-mode) (ee-insert-test-python))
-;; ((eq major-mode 'ruby-mode) (ee-insert-test-ruby))
-;; ((eq major-mode 'sh-mode) (ee-insert-test-sh))
-;; ((eq major-mode 'tcl-mode) (ee-insert-test-tcl))
-;; ((eq major-mode 'idris-mode) (ee-insert-test-idris))
-;; ((eq major-mode 'haskell-mode) (ee-insert-test-haskell))
-;; (t (error "ee-insert-test: Unsupported major mode"))))
+;; «examples» (to ".examples")
+;; See: (find-eepitch-intro "3.1. `find-eeit-links'")
+(defun ee-insert-test-haskell-mode ()
+ (interactive)
+ (insert (format "
+{-
+ (eepitch-ghci)
+ (eepitch-kill)
+ (eepitch-ghci)
+:load %s
+
+-}
+" (buffer-name))))
(defun ee-insert-test-julia-mode ()
(interactive)
@@ -147,26 +161,16 @@ source %s
}
" (buffer-name))))
-(defun ee-insert-test-idris-mode ()
+(defun ee-insert-test-tuareg-mode ()
(interactive)
(insert (format "
-{-
- (eepitch-to-buffer \"*idris-repl*\")
-
--}
-" (buffer-name))))
-
-
-(defun ee-insert-test-haskell-mode ()
- (interactive)
- (insert (format "
-{-
- (eepitch-ghci)
+(*
+ (eepitch-ocaml)
(eepitch-kill)
- (eepitch-ghci)
-:load %s
+ (eepitch-ocaml)
+#use \"%s\";;
--}
+*)
" (buffer-name))))
diff --git a/eev-tlinks.el b/eev-tlinks.el
index 58414a4..71fc0f0 100644
--- a/eev-tlinks.el
+++ b/eev-tlinks.el
@@ -19,7 +19,7 @@
;;
;; Author: Eduardo Ochs <eduardoochs@gmail.com>
;; Maintainer: Eduardo Ochs <eduardoochs@gmail.com>
-;; Version: 2020feb20
+;; Version: 2020oct13
;; Keywords: e-scripts
;;
;; Latest version: <http://angg.twu.net/eev-current/eev-tlinks.el>
@@ -58,11 +58,10 @@
;; «.ee-copy-rest» (to "ee-copy-rest")
;;
;; «.find-find-links-links» (to "find-find-links-links")
-;; «.ee-ffll-functions» (to "ee-ffll-functions")
;; «.find-find-links-links-new» (to "find-find-links-links-new")
+;; «.ee-ffll-functions» (to "ee-ffll-functions")
;;
;; «.find-intro-links» (to "find-intro-links")
-;; «.find-pdflikedef-links» (to "find-pdflikedef-links")
;; «.find-eev-header-links» (to "find-eev-header-links")
;;
;; «.find-debpkg-links» (to "find-debpkg-links")
@@ -80,6 +79,9 @@
;; «.find-escreenshot-links» (to "find-escreenshot-links")
;; «.find-windows-eepitch-lua-links» (to "find-windows-eepitch-lua-links")
;; «.find-extra-file-links» (to "find-extra-file-links")
+;; «.find-emacs-tangents-links» (to "find-emacs-tangents-links")
+;; «.find-eeit-links» (to "find-eeit-links")
+;; «.find-texlive-links» (to "find-texlive-links")
(require 'eev-env)
@@ -212,8 +214,9 @@ See: (find-eev \"eev-tlinks.el\" \"ee-copy-rest\")"
;;;
;;
;; «find-find-links-links» (to ".find-find-links-links")
-;; See: (find-templates-intro "horrible" "kludge")
;; Test: (find-find-links-links "u" "find-links" "k stem args")
+;; THIS IS OBSOLETE - DON'T USE THIS!
+;; Use `find-find-links-links-new' instead.
(defun ee-prepend-commas (str)
(save-match-data
@@ -223,6 +226,8 @@ See: (find-eev \"eev-tlinks.el\" \"ee-copy-rest\")"
(defun ee-if-nil-setqs (vars sep)
(mapconcat 'ee-if-nil-setq (save-match-data (ee-split vars)) sep))
+(defalias 'find-find-links-links-old 'find-find-links-links)
+
(defun find-find-links-links (&optional k stem args &rest pos-spec-list)
"Visit a temporary buffer containing hyperlinks for foo."
(interactive)
@@ -273,6 +278,40 @@ This is an internal function used by `find-{stem}-links'.\"
+
+;;; __ _ _ _ _ _ /\ ____
+;;; / _(_)_ __ __| | | (_)_ __ | | ____|/\|___ \ _ __ _____
__
+;;; | |_| | '_ \ / _` |_____| | | '_ \| |/ / __| __) |____| '_ \ / _ \ \ /\
/ /
+;;; | _| | | | | (_| |_____| | | | | | <\__ \ / __/_____| | | | __/\ V V
/
+;;; |_| |_|_| |_|\__,_| |_|_|_| |_|_|\_\___/ |_____| |_| |_|\___|
\_/\_/
+;;;
+;; «find-find-links-links-new» (to ".find-find-links-links-new")
+;; Test: (find-find-links-links-new)
+;; Many of the templated functions of eev were written using this.
+;; They all have a line saying ";; Skel:" that generates their "skeleton".
+;; See: (find-eevgrep "grep --color -nH --null -e Skel: *.el")
+;;
+(defun find-find-links-links-new (&optional stem args vars &rest pos-spec-list)
+"Visit a temporary buffer containing a skeleton of a find-*-links function."
+ (interactive)
+ (setq stem (or stem "{stem}"))
+ (setq args (or args "{args}"))
+ (setq vars (or vars "{vars}"))
+ (apply 'find-elinks-elisp
+ `((find-find-links-links-new ,stem ,args ,vars ,@pos-spec-list)
+ (find-find-links-links-new "mytask" "foo bar" "" ,@pos-spec-list)
+ (find-find-links-links-new "mytask" "foo bar" "plic bletch"
,@pos-spec-list)
+ ;; Convention: the first sexp always regenerates the buffer.
+ (find-efunction 'find-find-links-links-new)
+ ""
+ ,(ee-template0 ";; <find-{stem}-links>")
+ ,(concat ";; Skel: " (ee-S `(find-find-links-links-new ,stem ,args
,vars)))
+ ";;"
+ ,(ee-ffll-defun stem args vars)
+ )
+ pos-spec-list))
+
+
;;; __ __ _ _ _
;;; ___ ___ / _|/ _| | | | __/\__
;;; / _ \/ _ \_____| |_| |_| | | |_____\ /
@@ -282,15 +321,6 @@ This is an internal function used by `find-{stem}-links'.\"
;; «ee-ffll-functions» (to ".ee-ffll-functions")
;; Low-level functions used by find-find-links-links-new.
;;
-;; The original `find-find-links-links' whas a horrible kludge.
-;; See: (find-templates-intro "horrible" "kludge")
-;; This is an attempt to rewrite it.
-;; It was inspired by discussions with Marc Simpson.
-;; Version (of the ee-ffll-functions and find-find-links-links-new):
-;; 2020jan07.
-;; Status: `find-find-links-links-new' doesn't exist yet, but the
-;; tests below work.
-
;; Tests:
;; (ee-ffll-optional "")
;; (ee-ffll-optional "foo bar")
@@ -376,29 +406,6 @@ This is an internal function used by `find-{stem}-links'.\"
(ee-ffll-defun-without-lets stem args)))
-;; «find-find-links-links-new» (to ".find-find-links-links-new")
-;; Test: (find-find-links-links-new)
-;;
-(defun find-find-links-links-new (&optional stem args vars &rest pos-spec-list)
-"Visit a temporary buffer containing a skeleton of a find-*-links function."
- (interactive)
- (setq stem (or stem "{stem}"))
- (setq args (or args "{args}"))
- (setq vars (or vars "{vars}"))
- (apply 'find-elinks-elisp
- `((find-find-links-links-new ,stem ,args ,vars ,@pos-spec-list)
- (find-find-links-links-new "mytask" "foo bar" "" ,@pos-spec-list)
- (find-find-links-links-new "mytask" "foo bar" "plic bletch"
,@pos-spec-list)
- ;; Convention: the first sexp always regenerates the buffer.
- (find-efunction 'find-find-links-links-new)
- ""
- ,(ee-template0 ";; <find-{stem}-links>")
- ,(concat ";; Skel: " (ee-S `(find-find-links-links-new ,stem ,args
,vars)))
- ";;"
- ,(ee-ffll-defun stem args vars)
- )
- pos-spec-list))
-
@@ -413,22 +420,24 @@ This is an internal function used by
`find-{stem}-links'.\"
;;; |_|_| |_|\__|_| \___/ |_|_|_| |_|_|\_\___/
;;;
;; «find-intro-links» (to ".find-intro-links")
-;; (find-find-links-links "i" "intro" "stem")
-;; A test: (find-intro-links)
-
+;; Skel: (find-find-links-links-new "intro" "stem" "")
+;; Test: (find-intro-links)
+;;
(defun find-intro-links (&optional stem &rest pos-spec-list)
"Visit a temporary buffer with a skeleton for defining `find-<STEM>-intro'.
All `find-*-intro' functions in eev-intro.el were written using this.
See: (find-eev \"eev-intro.el\")"
(interactive)
(setq stem (or stem "{stem}"))
- (apply 'find-elinks-elisp
- `((find-intro-links ,stem ,@pos-spec-list)
+ (apply
+ 'find-elinks-elisp
+ `((find-intro-links ,stem ,@pos-spec-list)
(find-intro-links "{stem}" ,@pos-spec-list)
(find-intro-links "foo" ,@pos-spec-list)
;; Convention: the first sexp always regenerates the buffer.
(find-efunction 'find-intro-links)
- ,(ee-template0 "\
+ ""
+ ,(ee-template0 "\
;; (ee-copy-rest 1 '(find-eev \"eev-intro.el\"))
;; (find-{stem}-intro)
@@ -441,7 +450,7 @@ See: (find-eev \"eev-intro.el\")"
\\(Re)generate: (find-{stem}-intro)
Source code: (find-efunction 'find-{stem}-intro)
More intros: (find-eev-quick-intro)
- (find-eval-intro)
+ (find-eev-intro)
(find-eepitch-intro)
This buffer is _temporary_ and _editable_.
It is meant as both a tutorial and a sandbox.
@@ -451,7 +460,9 @@ Hello
\" pos-spec-list)))
;; (find-{stem}-intro)
-")) pos-spec-list))
+")
+ )
+ pos-spec-list))
;; (find-intro-links)
;; (find-intro-links "emacs")
@@ -460,82 +471,6 @@ Hello
-;;; _ __ _ _ _ _ __
-;;; _ __ __| |/ _| (_) | _____ __| | ___ / _|
-;;; | '_ \ / _` | |_| | | |/ / _ \/ _` |/ _ \ |_
-;;; | |_) | (_| | _| | | < __/ (_| | __/ _|
-;;; | .__/ \__,_|_| |_|_|_|\_\___|\__,_|\___|_|
-;;; |_|
-;;
-;; «find-pdflikedef-links» (to ".find-pdflikedef-links")
-;; Obsolete! Was used in: (find-eev "eev-pdflike-old.el")
-;; e.g. (find-eev "eev-pdflike-old.el" "defalias 'find-xdvipage")
-;; (find-find-links-links "pdflikedef" "stem firstargs")
-;;
-(defun find-pdflikedef-links (&optional stem firstargs &rest rest)
- "Visit a temporary buffer containing hyperlinks for pdflikedef."
- (interactive)
- (setq stem (or stem "{stem}"))
- (setq firstargs (or firstargs "{firstargs}"))
- (apply 'find-elinks-elisp `(
- ;; Convention: the first sexp always regenerates the buffer.
- (find-pdflikedef-links ,stem ,firstargs ,@rest)
- (find-efunction 'find-pdflikedef-links)
- (emacs-lisp-mode)
- ;; Body:
- ""
- ,(ee-template0 "\
-;; (find-efunction 'code-{stem})
-
-;; find-{stem}page
-;; find-{stem}-page
-;; code-{stem}
-;;
-\(defalias 'find-{stem}page
- 'find-{stem}-page)
-\(defun find-{stem}-page (fname &optional page &rest rest)
- (find-bgprocess (ee-find-{stem}-page fname page)))
-\(defvar ee-find-{stem}-page-options '())
-\(defun ee-find-{stem}-page (fname &optional page)
- `(\"{stem}\"
- ,@ee-find-{stem}-page-options
- ,@(if page `(,(format \"--page=%d\" page)))
- ,fname))
-
-\(defun code-{stem} ({firstargs} &rest rest)
- (eval (ee-read (apply 'ee-code-{stem} {firstargs} rest))))
-\(defun find-code-{stem} ({firstargs} &rest rest)
- (find-estring-elisp (apply 'ee-code-{stem} {firstargs} rest)))
-\(defun ee-code-{stem} ({firstargs} &rest rest)
- (concat (ee-template0 \"\\
-\\(defun find-{<}c{>}page (&optional page &rest rest)
- (find-{stem}-page {<}(ee-pp0 fname){>} page))
-{<}(ee-code-pdftext-rest rest){>}
-\") (ee-code-pdftext-rest rest)))
-
-\(code-brfile 'find-xpdf-page :local 'brxpdfl :dired 'brxpdfl)
-
-
-;; Tests:
-;; (find-epp (ee-find-{stem}-page \"/tmp/foo.pdf\"))
-;; (find-epp (ee-find-{stem}-page \"/tmp/foo.pdf\" 2))
-;; (find-{stem}-page \"/tmp/foo.pdf\")
-;; (find-{stem}-page \"/tmp/foo.pdf\" 2)
-;;
-;; (find-code-{stem} \"foo\" \"/tmp/foo.pdf\")
-;; (code-{stem} \"foo\" \"/tmp/foo.pdf\")
-;; (find-foopage)
-;; (find-foopage 2)
-;; (code-pdftotext \"foo\" \"/tmp/foo.pdf\")
-")
- ) rest))
-
-;; (find-pdflikedef-links "djvu" "c fname")
-;; (find-efunctionpp 'find-pdflikedef-links)
-
-
-
-
;;; _ _
;;; ___ _____ __ | |__ ___ __ _ __| | ___ _ __
;;; / _ \/ _ \ \ / /____| '_ \ / _ \/ _` |/ _` |/ _ \ '__|
@@ -1141,10 +1076,11 @@ cd {dir}
"See: (find-psne-intro)"
(interactive)
(setq url (or url "{url}"))
- (setq wget-options (or wget-options ""))
+ (setq wget-options (or wget-options "-nc"))
(apply 'find-elinks
`((find-psne-links ,url ,wget-options ,@pos-spec-list)
(find-psne-links ,url "-c" ,@pos-spec-list)
+ (find-psne-links ,url "" ,@pos-spec-list)
;; Convention: the first sexp always regenerates the buffer.
(find-efunction 'find-psne-links)
""
@@ -1452,7 +1388,7 @@ Warning: the last one is in Portuguese..."
(eepitch-shell2)
mkdir -p $S/http/angg.twu.net/eev-videos/
cd $S/http/angg.twu.net/eev-videos/
-wget -c 'http://angg.twu.net/eev-videos/{anggstem}.mp4'
+wget -nc 'http://angg.twu.net/eev-videos/{anggstem}.mp4'
echo 'http://angg.twu.net/eev-videos/{anggstem}.mp4' >> ~/.psne.log
# Test:
@@ -1841,6 +1777,172 @@ os.exit()
+;; «find-emacs-tangents-links» (to ".find-emacs-tangents-links")
+;; Skel: (find-find-links-links-new "emacs-tangents" "yyyy mm dd msg txtstem"
"")
+;; Test: (find-emacs-tangents-links "2020" "10" "05")
+;;
+(defun find-emacs-tangents-links (&optional yyyy mm dd msg txtstem &rest
pos-spec-list)
+"Visit a temporary buffer with hyperlinks to a post in emacs-tangents."
+ (interactive)
+ (setq yyyy (or yyyy "{yyyy}"))
+ (setq mm (or mm "{mm}"))
+ (setq dd (or dd "{dd}"))
+ (setq msg (or msg "{msg}"))
+ (setq txtstem (or txtstem "{txtstem}"))
+ (apply
+ 'find-elinks
+ `((find-emacs-tangents-links ,yyyy ,mm ,dd ,msg ,txtstem ,@pos-spec-list)
+ ;; Convention: the first sexp always regenerates the buffer.
+ (find-emacs-tangents-links "2020" "10" "05" "msg00000" "txts2ETp920ql")
+ (find-emacs-tangents-links "2018" "01" "29" "msg00025" "txtJ1ftXqItdm")
+ (find-efunction 'find-emacs-tangents-links)
+ ""
+ ,(ee-template0 "\
+# https://sachachua.com/blog/{yyyy}/
+# https://sachachua.com/blog/{yyyy}/{mm}/
+# https://sachachua.com/blog/{yyyy}/{mm}/{yyyy}-{mm}-{dd}-emacs-news/
+# https://lists.gnu.org/archive/html/emacs-tangents/{yyyy}-{mm}/
+# https://lists.gnu.org/archive/html/emacs-tangents/{yyyy}-{mm}/{msg}.html
+
+ (eepitch-shell)
+ (eepitch-kill)
+ (eepitch-shell)
+# (find-fline \"~/usrc/emacs-tangents/\")
+# (find-fline \"~/usrc/emacs-tangents/{yyyy}-{mm}-{dd}-emacs-news.org\")
+
+mkdir -p ~/usrc/emacs-tangents/
+cd ~/usrc/emacs-tangents/
+# rm -v {yyyy}-{mm}-{dd}-emacs-news.org
+wget -nc -O {yyyy}-{mm}-{dd}-emacs-news.org \\
+ https://lists.gnu.org/archive/html/emacs-tangents/{yyyy}-{mm}/{txtstem}.txt
+")
+ )
+ pos-spec-list))
+
+
+
+
+;; «find-eeit-links» (to ".find-eeit-links")
+;; Skel: (find-find-links-links-new "eeit" "majormode" "majormodestr
eeitfunstr eeitfun")
+;; See: (find-eepitch-intro "3.1. `find-eeit-links'")
+;; Test: (find-eeit-links 'lua-mode)
+;;
+(defun find-eeit-links (&optional majormode &rest pos-spec-list)
+"Visit a temporary buffer containing hyperlinks for eeit."
+ (interactive)
+ (setq majormode (or majormode major-mode))
+ (let* ((majormodestr (symbol-name majormode))
+ (eeitfunstr (concat "ee-insert-test-" majormodestr))
+ (eeitfun (intern eeitfunstr)))
+ (apply
+ 'find-elinks-elisp
+ `((find-eeit-links ',majormode ,@pos-spec-list)
+ ;; Convention: the first sexp always regenerates the buffer.
+ ;; ""
+ ,(ee-template0 "\
+;; (find-efunction 'find-eeit-links)
+;; (find-eepitch-intro \"3. Test blocks\")
+;; (find-eepitch-intro \"3.1. `find-eeit-links'\")
+;; (find-eev \"eev-testblocks.el\" \"examples\")
+
+;; Current definition:
+;; (find-efunction '{eeitfun})
+;; (find-efunctionpp '{eeitfun})
+;; (find-epp (ee-defun-sexp-for '{eeitfun}))
+
+
+;; <{eeitfunstr}>
+;;
+(defun {eeitfunstr} ()
+ (interactive)
+ (insert (format \"
+--[[
+ (eepitch-lua51)
+ (eepitch-kill)
+ (eepitch-lua51)
+dofile \\\"%s\\\"
+
+--]]
+\" (buffer-name))))
+
+;; Test:
+;; ({eeitfunstr})
+
+")
+ )
+ pos-spec-list)))
+
+
+
+
+;;; _____ __ ___ _
+;;; |_ _|__\ \/ / | (_)_ _____
+;;; | |/ _ \\ /| | | \ \ / / _ \
+;;; | | __// \| |___| |\ V / __/
+;;; |_|\___/_/\_\_____|_| \_/ \___|
+;;;
+;; «find-texlive-links» (to ".find-texlive-links")
+
+(defun find-texlive-links (&optional date &rest pos-spec-list)
+"Visit a temporary buffer containing an e-script for installing texlive from
upstream."
+ (interactive)
+ (setq date (or date "{date}"))
+ (apply 'find-elinks
+ `((find-texlive-links ,date ,@pos-spec-list)
+ ;; Convention: the first sexp always regenerates the buffer.
+ (find-texlive-links "20190809")
+ (find-efunction 'find-texlive-links)
+ ""
+ ,(ee-template0 "\
+# https://www.tug.org/texlive/
+# https://www.tug.org/texlive/acquire-netinstall.html
+# https://www.tug.org/texlive/quickinstall.html
+# http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
+# (find-fline \"$S/http/mirror.ctan.org/systems/texlive/tlnet/\")
+# (find-fline
\"$S/http/mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz\")
+# https://www.tug.org/texlive/doc/install-tl.html
+# (find-fline \"~/usrc/\" \"install-tl-\")
+# (find-fline \"~/.texlive2018/\")
+# (find-fline \"~/.texlive2019/\")
+# (find-fline \"/usr/local/texlive/2018/\")
+# (find-fline \"/usr/local/texlive/2019/\")
+# (find-fline \"/usr/local/texlive/2019/\" \"install-tl.log\")
+# (find-fline \"/usr/local/texlive/2019/release-texlive.txt\")
+
+ (eepitch-shell2)
+ (eepitch-kill)
+ (eepitch-shell2)
+# rm -rfv ~/.texlive2018/
+# sudo rm -rfv /usr/local/texlive/2018/
+
+mkdir -p $S/http/mirror.ctan.org/systems/texlive/tlnet/
+cd $S/http/mirror.ctan.org/systems/texlive/tlnet/
+rm -fv $S/http/mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
+wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
+echo http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
>> ~/.psne.log
+# (find-fline
\"$S/http/mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz\")
+# ^ Check the date here and adjust the {<}date{>} parameter of the template
+
+rm -Rfv ~/usrc/install-tl-{date}/
+mkdir ~/usrc/
+tar -C ~/usrc/ -xvzf \
+ $S/http/mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
+cd ~/usrc/install-tl-{date}/
+# sudo ./install-tl
+sudo ./install-tl -select-repository
+
+# (code-c-d \"tlinstall\" \"~/usrc/install-tl-{date}/\")
+# (find-tlinstallfile \"\")
+# (find-tlinstallfile \"install-tl.log\")
+# (find-tlinstallfile \"install-tl\")
+# https://www.tug.org/texlive/doc/install-tl.html
+
+")
+ )
+ pos-spec-list))
+
+;; Test: (find-texlive-links)
+
diff --git a/eev-wrap.el b/eev-wrap.el
index d5ece26..d50a7f0 100644
--- a/eev-wrap.el
+++ b/eev-wrap.el
@@ -181,6 +181,7 @@ have to run an \"undo\"."
;;; |_| |_| |_.__(_) \___||___/\___|_| |_| .__/ \__| |_.__/|_|_|\_\
;;; |_|
;;
+;; See: (find-eev-quick-intro "8.4. Creating e-script blocks")
;; (define-key eev-mode-map "\M-B" 'eewrap-escript-block)
(defun eewrap-escript-block () (interactive)
@@ -309,6 +310,7 @@ have to run an \"undo\"."
;;; | | | |_____| __/ _ | |_) | (_| | _| | | < __/
;;; |_| |_| |_| (_) | .__/ \__,_|_| |_|_|_|\_\___|
;;; |_|
+;;
;; See: (find-pdf-like-intro)
;; (define-key eev-mode-map "\M-P" 'eewrap-pdflike)
@@ -332,8 +334,10 @@ have to run an \"undo\"."
;;; | | | |_____| |_| |_ | |_) | (_| | _| | | < __/_____| | | | | | <
;;; |_| |_| \__\_(_) | .__/ \__,_|_| |_|_|_|\_\___| |_|_|_| |_|_|\_\
;;; |_|
+;;
;; See: (find-pdf-like-intro)
;; (define-key eev-mode-map "\M-Q" 'eewrap-pdflike-link)
+;; OBSOLETE.
(defun eewrap-pdflike-link () (interactive)
(ee-this-line-wrapn 2 'ee-wrap-pdflike-link))
diff --git a/eev.el b/eev.el
index e1c3314..38f9902 100644
--- a/eev.el
+++ b/eev.el
@@ -6,7 +6,7 @@
;; Package-Requires: ((emacs "24.1"))
;; Keywords: lisp e-scripts
;; URL: http://angg.twu.net/#eev
-;; Version: 20200928
+;; Version: 20201013
;; 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