branch: externals/eev commit 37a6ddc553af6cdc27399db27955ea2ab5f0244b Author: Eduardo Ochs <eduardoo...@gmail.com> Commit: Eduardo Ochs <eduardoo...@gmail.com>
New file: "eev-hydras.el". --- ChangeLog | 17 ++++ VERSION | 4 +- eev-audiovideo.el | 5 +- eev-hydras.el | 111 +++++++++++++++++++++ eev-intro.el | 78 +++++++++++++-- eev-template0.el | 17 ++-- eev-tlinks.el | 285 ++++++++++++++++++++++++++++++++---------------------- 7 files changed, 384 insertions(+), 133 deletions(-) diff --git a/ChangeLog b/ChangeLog index 30bf224..069837c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2021-05-12 Eduardo Ochs <eduardoo...@gmail.com> + + * eev-intro.el (find-refining-intro, find-here-links-intro): added + several "[Video links:]" blocks. + + * eev-hydras.el: new file. + +2021-05-09 Eduardo Ochs <eduardoo...@gmail.com> + + * eev-tlinks.el (ee-psnevideo-download-if-needed): renamed to + `ee-psne-if-needed'. + (ee-psnevideo-download): renamed to `ee-psne-download'. + (ee-psnevideo-download0): renamed to `ee-psne-download0'. + (ee-psnevideo-links): rewritten. + + * eev-template0.el (ee-template00): added a `save-match-data'. + 2021-05-06 Eduardo Ochs <eduardoo...@gmail.com> * eev-beginner.el: rewrote the comments. diff --git a/VERSION b/VERSION index 3154197..66ebd8c 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Thu May 6 18:24:24 GMT 2021 -Thu May 6 15:24:24 -03 2021 +Wed May 12 05:06:09 GMT 2021 +Wed May 12 02:06:09 -03 2021 diff --git a/eev-audiovideo.el b/eev-audiovideo.el index df6f248..abffaad 100644 --- a/eev-audiovideo.el +++ b/eev-audiovideo.el @@ -226,8 +226,11 @@ ;; «youtube-time» (to ".youtube-time") -;; Tests: (ee-time-to-youtube-time "2") +;; Tests: (ee-time-to-youtube-time "") +;; (ee-time-to-youtube-time "!") +;; (ee-time-to-youtube-time "2") ;; (ee-time-to-youtube-time "23") +;; (ee-time-to-youtube-time "123") ;; (ee-time-to-youtube-time "1:23") ;; (ee-time-to-youtube-time "1:23:43") ;; diff --git a/eev-hydras.el b/eev-hydras.el new file mode 100644 index 0000000..ef62147 --- /dev/null +++ b/eev-hydras.el @@ -0,0 +1,111 @@ +;;; eev-hydras.el --- eev functions that use hydra.el. + +;; Copyright (C) 2021 Free Software Foundation, Inc. +;; +;; This file is part of GNU eev. +;; +;; GNU eev is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; GNU eev is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. +;; +;; Author: Eduardo Ochs <eduardoo...@gmail.com> +;; Maintainer: Eduardo Ochs <eduardoo...@gmail.com> +;; Version: 20210511 +;; Keywords: e-scripts +;; +;; Latest version: <http://angg.twu.net/eev-current/eev-hydras.el> +;; htmlized: <http://angg.twu.net/eev-current/eev-hydras.el.html> +;; See also: <http://angg.twu.net/eev-current/eev-readme.el.html> +;; <http://angg.twu.net/eev-intros/find-eev-intro.html> +;; <http://angg.twu.net/eev-intros/find-here-links-intro.html> +;; (find-eev-intro) +;; (find-here-links-intro) + +;;; Commentary: + +;; This is a new, experimental feature that is not loaded by +;; default. It is mentioned briefly here: +;; +;; (find-refining-intro "5. Pointing to anchors") +;; (find-refining-intro "5. Pointing to anchors" "but I don't touch-type") +;; +;; It depends on the package "hydra". +;; I need to record a short video about this. +;; This code will probably change a LOT in the next months. + + +;; See: https://github.com/abo-abo/hydra +;; (find-epackage-links 'hydra "hydra" t) +;; (find-epackage 'hydra) +;; +(require 'hydra) + + + +(defun eev-index-replace (from-string to-string) + "Replace FROM-STRING to TO-STRING in the current line." + (search-forward from-string (ee-eol)) + (replace-match to-string) + (eek "C-a")) + +(defun eev-index-edit () + "Call `eev-index-edit/body' to edit the index." + (interactive) + ;; + ;; Definition of the hydra: + ;; + (defhydra hydra-eev-index-edit (:color green :hint nil) + " +_q_:quit ^^^^ _0_: delthiswindow + werty: _u_:prev _i_:insert _o_:other window _p_:prev +asdfgh: _j_:next _k_:kill _l_:eval + ^ ^ _,_:adj<- _._:adj-> +Standard usage: _k__o__p__l__i__0_q +Use `_,_'s and `_._'s between the `_i_' and the `_0_' to adjust the `(to ...)'.\n" + ;; + ;; Left column: movement by anchors + ("u" (re-search-backward (ee-tag-re))) + ("j" (re-search-forward (ee-tag-re))) + ;; Kill/Otherwindow/Prev/evaL/Insert/adj<-/adj->/delthiswindow: + ("k" (eek "C-a C-SPC <down> C-w")) + ("o" (eek "C-x 1 C-x 3 C-x o")) + ("p" (re-search-backward (ee-tag-re))) + ("l" (eek "M-e")) + ("i" (eek "C-a <down> C-y <up>")) + ("," (eev-index-replace "\t(to " "(to ")) + ("." (eev-index-replace "(to " "\t(to ")) + ("0" (eek "C-x 0")) + ;; Other keys: + ("<down>" (eek "<down>")) + ("<up>" (eek "<up>")) + ("1" (eek "C-x 1")) + ("2" (eek "M-2 M-e")) + ("<" (eek "M-<")) + ("M-<" (eek "M-<")) + ("q" nil)) + ;; + ;; End of the definition of the hydra. + ;; + ;; Call the hydra: + (hydra-eev-index-edit/body) + ) + +(defalias 'ei 'eev-index-edit) + + +(provide 'eev-hydras) + + +;; Local Variables: +;; coding: utf-8-unix +;; no-byte-compile: t +;; End: diff --git a/eev-intro.el b/eev-intro.el index 8fcf7b9..ea25160 100644 --- a/eev-intro.el +++ b/eev-intro.el @@ -19,7 +19,7 @@ ;; ;; Author: Eduardo Ochs <eduardoo...@gmail.com> ;; Maintainer: Eduardo Ochs <eduardoo...@gmail.com> -;; Version: 20210506 +;; Version: 20210511 ;; Keywords: e-scripts ;; ;; Latest version: <http://angg.twu.net/eev-current/eev-intro.el> @@ -680,7 +680,7 @@ Try these links (some of them need the Emacs manuals installed): This part of the eev tutorials has links to almost all the keys that I've learned by heart after using Emacs for 20 years: - (find-emacs-intro \"Basic keys (Emacs)\") + (find-emacs-keys-intro \"2. Key sequences\") They are not very many, because I use this a lot, @@ -850,6 +850,7 @@ For more details see: (find-eev2019video \"15:11\" \"Demo: the eepitch block (in red star lines)\") (find-eev2019video \"15:48\" \"Demo: eepitch on non-red star lines\") (find-eev2019video \"15:56\" \"Demo: eepitch in action\") + (find-testblsvideo \"2:33\" \"if I run f8 here I start a new Lua interpreter\") @@ -3005,6 +3006,13 @@ Note that `M-h M-1' undoes what `M-h M-3' did. In a figure: |_______________| |__________|__________| |________________| +[Video links:] + (find-eevfherelvideo \"4:40\" \"2.1. The 3-window setting - and going back from it\") + (find-eevfherelvideo \"6:47\" \"`M-h M-3': three windows; `M-h M-1' goes back\") + (find-eevfherelvideo \"7:29\" \"the original configuration can be anything\") + + + 6. Copying the hyperlink @@ -3034,6 +3042,10 @@ the one with the key sequences described here: (find-eev-quick-intro \"5.2. Cutting and pasting\") +[Video links:] + (find-eevfherelvideo \"8:56\" \"2.2. Copying one link\") + + @@ -3160,6 +3172,15 @@ discuss them here. See: If you want to add support for more complex pos-spec-lists, just replace `ee-goto-rest' with your own extended version. + [Video links:] + (find-eev2019video \"1:08\" \"a string to search for\") + (find-eev2020video \"2:25\" \"variants that were better behaved\") + (find-eev2020video \"2:36\" \"in the same window\") + (find-eev2020video \"2:53\" \"pos-spec-lists\") + + + + @@ -3211,6 +3232,10 @@ based on `C-y' (`yank'), but `M-h M-y' \"yanks\" the text at the end of the sexp, in quotes, as an new argument. + [Video links:] + (find-eevfherelvideo \"10:30\" \"2.3. Duplicating and refining\") + (find-eevfherelvideo \"10:53\" \"as a string at the end of the sexp\") + @@ -3270,6 +3295,12 @@ Note: `M-h M-w' (`ee-copy-this-line-to-kill-ring') is a key sequence intended for beginners. I prefer to use something like `C-a shift-<down> M-w'. + [Video links:] + (find-eevfherelvideo \"12:35\" \"3. Using a single window\") + (find-eevfherelvideo \"13:19\" \"go back usually by using\") + + + @@ -3346,6 +3377,12 @@ The big figure below shows all the key sequences: |_________________|_____________________| +[Video links:] + (find-eevfherelvideo \"8:56\" \"2.2. Copying one link\") + (find-eevfherelvideo \"10:10\" \"when people know a few more keys... C-w and M-w\") + (find-eevfherelvideo \"10:21\" \"that correspond to Cut, Copy, and Paste\") + + @@ -3448,15 +3485,38 @@ but I don't touch-type, and for me it became natural to hold the meta key down with my left thumb while I type `M-1hwhh' and `M-h2hyh-hw' _by moving my hands over the keyboard a lot_... -It would be nice to have a way to do this same series of actions -using keys that are good for touch typists. One possibilty is to -use transient-mode: +It would be nice to have a way to do this same series of actions using +keys that are good for touch typists. One possibilty is to use a +hydra; see the experimental code here: + + (find-eev \"eev-hydras.el\") - https://magit.vc/manual/transient/ - https://lists.gnu.org/archive/html/emacs-devel/2021-01/msg01120.html +If you are interested in discussing how to make this more usable, +please get in touch! -I can try to implement this myself _if I have touch-typists to -discuss it with_ - so if you're interested, get in touch! + +[Video links:] + (find-eevfherelvideo \"14:18\" \"4.1. Creating anchors\") + (find-eevfherelvideo \"15:22\" \"an index at the beginning of the file\") + (find-eevfherelvideo \"15:47\" \"the tutorial also explains ... `M-A'\") + (find-eevfherelvideo \"16:07\" \"`M-A' duplicates the line and...\") + (find-eevfherelvideo \"16:19\" \"use `M-B' to create something like this block here\") + (find-eevfherelvideo \"17:02\" \"4.2. The option :anchor for `code-c-d'\") + (find-eevfherelvideo \"17:21\" \"here I have one of the source files\") + (find-eevfherelvideo \"17:30\" \"here we have an index\") + (find-eevfherelvideo \"17:47\" \"this sexp is equivalent to\") + (find-eevfherelvideo \"18:12\" \"not all functions created by code-c-d behave in that way\") + (find-eevfherelvideo \"18:36\" \"let me give the short explanation\") + (find-eevfherelvideo \"18:57\" \"is a button that defines new functions\") + (find-eevfherelvideo \"19:04\" \"and this sexp here shows the code\") + (find-eevfherelvideo \"19:24\" \"this defun that defines find-eev\") + (find-eevfherelvideo \"20:04\" \"4.3. Shrinking hyperlinks\") + (find-eevfherelvideo \"20:25\" \"it has a demo here\") + (find-eevfherelvideo \"21:07\" \"4.4. The preceding tag\") + (find-eevfherelvideo \"21:35\" \"a variant of `M-h M-w'\") + (find-eevfherelvideo \"22:06\" \"it also explains in the echo area what it does\") + (find-eevfherelvideo \"22:43\" \"in this example the refined hyperlink is not useful\") + (find-eevfherelvideo \"22:48\" \"but here is a demo that makes more sense\") diff --git a/eev-template0.el b/eev-template0.el index ea40697..8d7a38f 100644 --- a/eev-template0.el +++ b/eev-template0.el @@ -1,6 +1,6 @@ ;;; eev-template0.el -- implement functions that eval `{}'s in a string. -;; Copyright (C) 2019 Free Software Foundation, Inc. +;; Copyright (C) 2019-2021 Free Software Foundation, Inc. ;; ;; This file is part of GNU eev. ;; @@ -19,7 +19,7 @@ ;; ;; Author: Eduardo Ochs <eduardoo...@gmail.com> ;; Maintainer: Eduardo Ochs <eduardoo...@gmail.com> -;; Version: 20210203 +;; Version: 20210509 ;; Keywords: e-scripts ;; ;; Latest version: <http://angg.twu.net/eev-current/eev-template0.el> @@ -100,23 +100,24 @@ set this variable temporarily in a `let'.") ;; (let ((hi "Here: ") (a 22) (b 33)) (ee-template00 "{hi}{a}+{b}={(+ a b)}")) ;; (defun ee-template00 (str) -"Replace substrings enclosed by `{}'s in STR by the result of evaluating them. + "Replace substrings enclosed by `{}'s in STR by the result of evaluating them. Examples:\n (ee-template00 \"a{(+ 2 3)}b\") --> \"a5b\"\n (let ((hi \"Here:\") (a 22) (b 33)) (ee-template00 \"{hi} {a} + {b} = {(+ a b)}\")) --> \"22 + 33 = 55\"" - (replace-regexp-in-string - ee-template00-re - (lambda (_code_) (format "%s" (eval (read (substring _code_ 1 -1))))) - str 'fixedcase 'literal)) + (save-match-data + (replace-regexp-in-string + ee-template00-re + (lambda (_code_) (format "%s" (eval (read (substring _code_ 1 -1))))) + str 'fixedcase 'literal))) ;; Test: ;; (ee-template0 "{<} a{(+ 2 3)} {>}") ;; (defun ee-template0 (str) -"Replace substrings enclosed by `{}'s in STR by the result of evaluating them. + "Replace substrings enclosed by `{}'s in STR by the result of evaluating them. Substrings of the form `{<}' and `{>}' in STR are replaced by `{' and `}' respectively; apart from that, this is the same as `ee-template00'. diff --git a/eev-tlinks.el b/eev-tlinks.el index 383e71d..2e00497 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: 20210227 +;; Version: 20210509 ;; Keywords: e-scripts ;; ;; Latest version: <http://angg.twu.net/eev-current/eev-tlinks.el> @@ -72,12 +72,14 @@ ;; «.find-git-links» (to "find-git-links") ;; «.find-fossil-links» (to "find-fossil-links") ;; «.find-apt-get-source-links» (to "find-apt-get-source-links") -;; «.find-eev-video-links» (to "find-eev-video-links") +;; +;; «.find-eevvideo-links» (to "find-eevvideo-links") ;; «.find-psnevideo-links» (to "find-psnevideo-links") +;; «.ee-psne-if-needed» (to "ee-psne-if-needed") ;; «.code-psnevideo» (to "code-psnevideo") ;; «.code-eevvideo» (to "code-eevvideo") -;; «.find-eevvideo-links» (to "find-eevvideo-links") ;; «.hardcoded-paths» (to "hardcoded-paths") +;; «.find-eev-video-links» (to "find-eev-video-links") ;; ;; «.find-latex-links» (to "find-latex-links") ;; «.find-lua-links» (to "find-lua-links") @@ -1368,76 +1370,36 @@ netcat -l -p {tgtport} -;;; _ _ -;;; ___ _____ __ __ _(_) __| | ___ ___ -;;; / _ \/ _ \ \ / /___\ \ / / |/ _` |/ _ \/ _ \ -;;; | __/ __/\ V /_____\ V /| | (_| | __/ (_) | -;;; \___|\___| \_/ \_/ |_|\__,_|\___|\___/ -;;; -;; «find-eev-video-links» (to ".find-eev-video-links") - -;; (find-find-links-links "{k}" "eev-video" "c anggstem youtubehash") - -(defun find-eev-video-links (&optional c anggstem youtubehash &rest pos-spec-list) -"Visit a temporary buffer containing a script for downloading an eev video. -See: (find-videos-intro) -Examples: - (find-eev-video-links \"eepitchvideo\" \"video4-eepitch\" \"Lj_zKC5BR64\") - (find-eev-video-links \"eevvideo2\" \"video2\" \"doeyn5MOaB8\") - (find-eev-video-links \"eevvideo2-pt\" \"video2pt\" \"yztYD9Y7Iz4\") -Warning: the last one is in Portuguese..." +;;; _ _ +;;; ___ _____ ____ _(_) __| | ___ ___ +;;; / _ \/ _ \ \ / /\ \ / / |/ _` |/ _ \/ _ \ +;;; | __/ __/\ V / \ V /| | (_| | __/ (_) | +;;; \___|\___| \_/ \_/ |_|\__,_|\___|\___/ +;;; +;; «find-eevvideo-links» (to ".find-eevvideo-links") +;; Used by: (find-videos-intro "2. Short links to eev video tutorials") +;; (find-eev "eev-audiovideo.el" "video-tutorials") +;; See: (find-audiovideo-intro "7.2. `find-eevvideo-links'") +;; Skel: (find-find-links-links-new "eevvideo" "c stem youtubeid time" "url") +;; Test: (find-eevvideo-links "eevnav" "M-x-list-packages-eev-nav" "0:00") +;; +(defun find-eevvideo-links (&optional c stem youtubeid time &rest pos-spec-list) +"Visit a temporary buffer containing hyperlinks for eevvideo." (interactive) (setq c (or c "{c}")) - (setq anggstem (or anggstem "{anggstem}")) - (setq youtubehash (or youtubehash "{youtubehash}")) - (let ((s (replace-regexp-in-string "." " " c))) - (apply 'find-elinks - `((find-eev-video-links ,c ,anggstem ,youtubehash) + (setq stem (or stem "{stem}")) + (setq youtubeid (or youtubeid "{youtubeid}")) + (setq time (or time "{time}")) + (let* ((url (format "http://angg.twu.net/eev-videos/%s.mp4" stem))) + (apply + 'find-elinks + `((find-eevvideo-links ,c ,stem ,youtubeid ,time ,@pos-spec-list) ;; Convention: the first sexp always regenerates the buffer. - (find-efunction 'find-eev-video-links) - "" - ,(ee-template0 "\ - Download (or make sure we have) a local copy of the video: - (eepitch-shell2) - (eepitch-kill) - (eepitch-shell2) -mkdir -p $S/http/angg.twu.net/eev-videos/ -cd $S/http/angg.twu.net/eev-videos/ -wget -nc 'http://angg.twu.net/eev-videos/{anggstem}.mp4' -echo 'http://angg.twu.net/eev-videos/{anggstem}.mp4' >> ~/.psne.log - -# Test: -# (find-fline {s} \"$S/http/angg.twu.net/eev-videos/\") -# (find-video {s} \"$S/http/angg.twu.net/eev-videos/{anggstem}.mp4\") -# (code-video \"{c}\" \"$S/http/angg.twu.net/eev-videos/{anggstem}.mp4\") -# (find-{c}) -# Error messages: -# (find-ebuffer \"*Messages*\") - -# See: (find-audiovideo-intro \"eev-avadj-mode\") -# (find-audiovideo-intro \"The time-from-bol\") -# (eev-avadj-mode 1) -# (find-{c} t) -# 0:00 - -# Links to the version at youtube: -# http://www.youtube.com/watch?v={youtubehash} -# http://www.youtube.com/watch?v={youtubehash}&t=0m00s -# http://www.youtube.com/watch?v={youtubehash}&t=0h00m00s -") + ;; (find-efunction 'find-eevvideo-links) + ,(ee-psnevideo-links c url youtubeid time) ) pos-spec-list))) -;; Links to all the eev videos (best ones first): -;; (find-eev-video-links "eepitchvideo" "video4-eepitch" "Lj_zKC5BR64") -;; (find-eev-video-links "eevvideo2" "video2" "doeyn5MOaB8") -;; (find-eev-video-links "eevvideo2-pt" "video2pt" "yztYD9Y7Iz4") -;; The ones with "pt" are in Portuguese, the other ones are in English. - -;; (find-eepitchvideo "0:18" "Demonstration (first time, very quickly)") - - - ;;; _ _ @@ -1449,7 +1411,8 @@ echo 'http://angg.twu.net/eev-videos/{anggstem}.mp4' >> ~/.psne.log ;; ;; «find-psnevideo-links» (to ".find-psnevideo-links") ;; Skel: (find-find-links-links-new "psnevideo" "c url youtubeid time" "url") -;; Test: (find-psnevideo-links "c333" "http://angg.twu.net/2020.1-C3/C3_aula_3_video_3.mp4") +;; Tests: (find-psnevideo-links "C" "http://foo.org/bar.mp4") +;; (find-psnevideo-links "C" "http://foo.org/bar.mp4" nil "1:23") ;; (defun find-psnevideo-links (&optional c url youtubeid time &rest pos-spec-list) "Visit a temporary buffer containing an e-script for downloading and playing URL." @@ -1465,24 +1428,53 @@ echo 'http://angg.twu.net/eev-videos/{anggstem}.mp4' >> ~/.psne.log ) pos-spec-list)) -(defun ee-psnevideo-links (c url youtubeid time) - (let* ((fname (ee-shorten-file-name (ee-url-to-fname url))) - (dir (file-name-directory fname)) - (youtubeurl (format "http://www.youtube.com/watch?v=%s" youtubeid)) - (youtubetime (or (ee-time-to-youtube-time time) "")) - (argtime (if (ee-time-to-youtube-time time) - (format " \"%s\"" time) - "")) - ) +;; Tests: +;; (find-estring (ee-psnevideo-links "C" "http://foo.org/bar.mp4")) +;; (find-estring (ee-psnevideo-links "C" "http://foo.org/bar.mp4" nil "1:23")) +;; (find-estring (ee-psnevideo-links "C" "http://foo.org/bar.mp4" "YID" "1:23")) +;; +(defun ee-psnevideo-links (c url &optional youtubeid time) + (setq youtubeid (or youtubeid "{youtubeid}")) + (setq time (or time "{time}")) + (let* ((fname (ee-shorten-file-name (ee-url-to-fname url))) + (argtime (ee-time-to-arg time))) (concat + ;; + ;; See: + ;; (find-audiovideo-intro "7. `code-psnevideo'" "second line") + ;; (find-audiovideo-intro "7. `code-psnevideo'" "redefine") + ;; (find-audiovideo-intro "7. `code-psnevideo'" "last part") + ;; (ee-template0 "\ # (find-video \"{fname}\"{argtime}) # (find-audiovideo-intro \"7. `code-psnevideo'\" \"second line\") # (find-audiovideo-intro \"7. `code-psnevideo'\" \"redefine\") -# (code-video \"{c}video\" \"{fname}\") -# (find-{c}video{argtime}) +# (code-video \"{c}video\" \"{fname}\") +# (find-{c}video{argtime}) + +") + (ee-psnevideo-url-youtube url youtubeid time) + "\n\n" + "# (find-audiovideo-intro \"7. `code-psnevideo'\" \"last part\")\n" + "\n\n" + (ee-psne-if-needed url) + ))) + + +;; Tests: +;; (find-estring (ee-psnevideo-url-youtube "http://foo.org/bar.mp4")) +;; (find-estring (ee-psnevideo-url-youtube "http://foo.org/bar.mp4" nil "1:23")) +;; +(defun ee-psnevideo-url-youtube (url &optional youtubeid time) + (setq youtubeid (or youtubeid "{youtubeid}")) + (setq time (or time "{time}")) + (let* ((fname (ee-shorten-file-name (ee-url-to-fname url))) + (dir (file-name-directory fname)) + (youtubeurl (format "http://www.youtube.com/watch?v=%s" youtubeid)) + (youtubetime (or (ee-time-to-youtube-time time) ""))) + (ee-template0 "\ # URL, local file, and a link to the directory of the local file: # {url} # {fname} @@ -1490,26 +1482,42 @@ echo 'http://angg.twu.net/eev-videos/{anggstem}.mp4' >> ~/.psne.log # Youtube: # (kill-new \"{youtubeurl}{youtubetime}\") -# {youtubeurl}{youtubetime} +# {youtubeurl}{youtubetime}") + )) -# (find-audiovideo-intro \"7. `code-psnevideo'\" \"last part\") -") (ee-psnevideo-download-if-needed url)))) +;; Tests: (ee-time-to-arg "") +;; (ee-time-to-arg "{time}") +;; (ee-time-to-arg "1:23") +;; (ee-time-to-arg nil) +;; See: (find-efunction 'ee-time-to-youtube-time) +;; +(defun ee-time-to-arg (time) + (if (ee-time-to-youtube-time time) + (format " \"%s\"" time) + "")) -(defun ee-psnevideo-download-if-needed (url) - (let* ((fname (ee-shorten-file-name (ee-url-to-fname url))) - (dir (file-name-directory fname))) - (if (file-exists-p (ee-expand fname)) - "# Local file found. No need to download it again.\n" - (ee-psnevideo-download url)))) -(defun ee-psnevideo-download (url) + +;; «ee-psne-if-needed» (to ".ee-psne-if-needed") +;; Tests: +;; (ee-psne-if-needed "http://www.gnu.org/software/emacs/emacs-paper.html") +;; (find-estring (ee-psne-if-needed "http://www.foo.org/bar.html")) +;; (find-estring (ee-psne-download "http://www.foo.org/bar.html")) +;; (find-estring (ee-psne-download0 "http://www.foo.org/bar.html")) +;; +(defun ee-psne-if-needed (url) + (if (file-exists-p (ee-expand (ee-url-to-fname url))) + "# Local file found. No need to download it again.\n" + (ee-psne-download url))) + +(defun ee-psne-download (url) (concat "\ # Local file not found! # You need to run this: \n -" (ee-psnevideo-download0 url))) +" (ee-psne-download0 url))) -(defun ee-psnevideo-download0 (url) +(defun ee-psne-download0 (url) (let* ((fname (ee-shorten-file-name (ee-url-to-fname url))) (dir (file-name-directory fname))) (ee-template0 "\ @@ -1522,10 +1530,15 @@ wget -nc '{url}' echo '{url}' >> ~/.psne.log # (find-fline \"{dir}\") +# See: (find-psne-intro) "))) + + + + ;;; _ _ _ ;;; ___ ___ __| | ___ _ __ ___ _ __ _____ _(_) __| | ___ ___ ;;; / __/ _ \ / _` |/ _ \_____| '_ \/ __| '_ \ / _ \ \ / / |/ _` |/ _ \/ _ \ @@ -1561,28 +1574,6 @@ echo '{url}' >> ~/.psne.log ;;; | (_| (_) | (_| | __/_____| __/ __/\ V / \ V /| | (_| | __/ (_) | ;;; \___\___/ \__,_|\___| \___|\___| \_/ \_/ |_|\__,_|\___|\___/ ;;; -;; «find-eevvideo-links» (to ".find-eevvideo-links") -;; Test: (find-eevvideo-links "eevnav" "M-x-list-packages-eev-nav" "0:00") -;; Skel: (find-find-links-links-new "eevvideo" "c stem youtubeid time" "url") -;; See: (find-audiovideo-intro "7.2. `find-eevvideo-links'") -;; -(defun find-eevvideo-links (&optional c stem youtubeid time &rest pos-spec-list) -"Visit a temporary buffer containing hyperlinks for eevvideo." - (interactive) - (setq c (or c "{c}")) - (setq stem (or stem "{stem}")) - (setq youtubeid (or youtubeid "{youtubeid}")) - (setq time (or time "{time}")) - (let* ((url (format "http://angg.twu.net/eev-videos/%s.mp4" stem))) - (apply - 'find-elinks - `((find-eevvideo-links ,c ,stem ,youtubeid ,time ,@pos-spec-list) - ;; Convention: the first sexp always regenerates the buffer. - ;; (find-efunction 'find-eevvideo-links) - ,(ee-psnevideo-links c url youtubeid time) - ) - pos-spec-list))) - ;; «code-eevvideo» (to ".code-eevvideo") ;; See: (find-audiovideo-intro "7.1. `code-eevvideo'") ;; Test: (find-code-eevvideo "eevnav" "M-x-list-packages-eev-nav") @@ -1620,7 +1611,75 @@ echo '{url}' >> ~/.psne.log ;; download. If you are aware of sites like that, please get in touch ;; and I'll create functions pointing to them! +;;; _ _ +;;; ___ _____ __ __ _(_) __| | ___ ___ +;;; / _ \/ _ \ \ / /___\ \ / / |/ _` |/ _ \/ _ \ +;;; | __/ __/\ V /_____\ V /| | (_| | __/ (_) | +;;; \___|\___| \_/ \_/ |_|\__,_|\___|\___/ +;;; +;; «find-eev-video-links» (to ".find-eev-video-links") +;; Obsolete? See: (find-audiovideo-intro "7.2. `find-eevvideo-links'") + +;; Skel: (find-find-links-links "{k}" "eev-video" "c anggstem youtubehash") +;; (find-find-links-links-new "eev-video" "c anggstem youtubehash" "") +(defun find-eev-video-links (&optional c anggstem youtubehash &rest pos-spec-list) +"Visit a temporary buffer containing a script for downloading an eev video. +See: (find-videos-intro) +Examples: + (find-eev-video-links \"eepitchvideo\" \"video4-eepitch\" \"Lj_zKC5BR64\") + (find-eev-video-links \"eevvideo2\" \"video2\" \"doeyn5MOaB8\") + (find-eev-video-links \"eevvideo2-pt\" \"video2pt\" \"yztYD9Y7Iz4\") +Warning: the last one is in Portuguese..." + (interactive) + (setq c (or c "{c}")) + (setq anggstem (or anggstem "{anggstem}")) + (setq youtubehash (or youtubehash "{youtubehash}")) + (let ((s (replace-regexp-in-string "." " " c))) + (apply 'find-elinks + `((find-eev-video-links ,c ,anggstem ,youtubehash) + ;; Convention: the first sexp always regenerates the buffer. + (find-efunction 'find-eev-video-links) + "" + ,(ee-template0 "\ + Download (or make sure we have) a local copy of the video: + (eepitch-shell2) + (eepitch-kill) + (eepitch-shell2) +mkdir -p $S/http/angg.twu.net/eev-videos/ +cd $S/http/angg.twu.net/eev-videos/ +wget -nc 'http://angg.twu.net/eev-videos/{anggstem}.mp4' +echo 'http://angg.twu.net/eev-videos/{anggstem}.mp4' >> ~/.psne.log + +# Test: +# (find-fline {s} \"$S/http/angg.twu.net/eev-videos/\") +# (find-video {s} \"$S/http/angg.twu.net/eev-videos/{anggstem}.mp4\") +# (code-video \"{c}\" \"$S/http/angg.twu.net/eev-videos/{anggstem}.mp4\") +# (find-{c}) +# Error messages: +# (find-ebuffer \"*Messages*\") + +# See: (find-audiovideo-intro \"eev-avadj-mode\") +# (find-audiovideo-intro \"The time-from-bol\") +# (eev-avadj-mode 1) +# (find-{c} t) +# 0:00 + +# Links to the version at youtube: +# http://www.youtube.com/watch?v={youtubehash} +# http://www.youtube.com/watch?v={youtubehash}&t=0m00s +# http://www.youtube.com/watch?v={youtubehash}&t=0h00m00s +") + ) + pos-spec-list))) + +;; Links to all the eev videos (best ones first): +;; (find-eev-video-links "eepitchvideo" "video4-eepitch" "Lj_zKC5BR64") +;; (find-eev-video-links "eevvideo2" "video2" "doeyn5MOaB8") +;; (find-eev-video-links "eevvideo2-pt" "video2pt" "yztYD9Y7Iz4") +;; The ones with "pt" are in Portuguese, the other ones are in English. + +;; (find-eepitchvideo "0:18" "Demonstration (first time, very quickly)")