branch: externals/eev commit fff4f9b0f00147434cb38911451cd329819bd79a Author: Eduardo Ochs <eduardoo...@gmail.com> Commit: Eduardo Ochs <eduardoo...@gmail.com>
Added `find-eeit-links' and \'find-emacs-tangents-links' --- ChangeLog | 44 +++++++ VERSION | 4 +- eejump.el | 1 + eev-elinks.el | 126 ++++++++++++++----- eev-intro.el | 364 ++++++++++++++++++++++++++++++++++-------------------- eev-testblocks.el | 60 ++++----- eev-tlinks.el | 121 ++++++++++++++++-- eev-wrap.el | 4 + 8 files changed, 519 insertions(+), 205 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ed98cd..7ab38bf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,47 @@ +2020-10-10 Eduardo Ochs <eduardoo...@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 <eduardoo...@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 <eduardoo...@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 <eduardoo...@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 <eduardoo...@gmail.com> * eev-intro.el (find-psne-intro): added two new sections, one on diff --git a/VERSION b/VERSION index 9b43c11..2d27046 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 +Sat Oct 10 07:04:21 GMT 2020 +Sat Oct 10 04:04:21 -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-elinks.el b/eev-elinks.el index edcd91d..e8e4c78 100644 --- a/eev-elinks.el +++ b/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") @@ -1117,59 +1118,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} + +# (ee-package-dir '{pkg}) +# (find-epp (ee-package-desc '{pkg})) + +# (code-c-d \"{c}\" \"{d}\") +# (find-{c}file \"\") -# http://elpa.gnu.org/packages/{pkgname}.html -# http://melpa.org/#/{pkgname} +# 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)))))) diff --git a/eev-intro.el b/eev-intro.el index 90fc7c5..4aaf50f 100644 --- a/eev-intro.el +++ b/eev-intro.el @@ -307,7 +307,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 @@ -2446,6 +2446,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 @@ -3486,6 +3487,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 +3673,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 +4195,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 +4993,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. @@ -8520,6 +8429,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 +8471,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 +8601,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: @@ -11356,9 +11270,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 +12188,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..892e6bc 100644 --- a/eev-testblocks.el +++ b/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..7ce02d2 100644 --- a/eev-tlinks.el +++ b/eev-tlinks.el @@ -19,7 +19,7 @@ ;; ;; Author: Eduardo Ochs <eduardoo...@gmail.com> ;; Maintainer: Eduardo Ochs <eduardoo...@gmail.com> -;; Version: 2020feb20 +;; Version: 2020oct06 ;; Keywords: e-scripts ;; ;; Latest version: <http://angg.twu.net/eev-current/eev-tlinks.el> @@ -80,6 +80,8 @@ ;; «.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") (require 'eev-env) @@ -413,22 +415,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 +445,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 +455,9 @@ Hello \" pos-spec-list))) ;; (find-{stem}-intro) -")) pos-spec-list)) +") + ) + pos-spec-list)) ;; (find-intro-links) ;; (find-intro-links "emacs") @@ -1841,6 +1847,103 @@ 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))) + + + 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))