Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
;;; eev-wrap.el --- wrap the current line into a hyperlink  -*- lexical-binding: nil; -*-

;; Copyright (C) 2013,2016,2017,2019,2020,2023 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 <eduardoochs@gmail.com>
;; Maintainer: Eduardo Ochs <eduardoochs@gmail.com>
;; Version:    20240220
;; Keywords:   e-scripts
;;
;; Latest version: <http://anggtwu.net/eev-current/eev-wrap.el>
;;       htmlized: <http://anggtwu.net/eev-current/eev-wrap.el.html>
;;       See also: <http://anggtwu.net/eev-current/eev-beginner.el.html>
;;                 <http://anggtwu.net/eev-intros/find-eev-intro.html>
;;                 <http://anggtwu.net/eev-intros/find-wrap-intro.html>
;;                                               (find-eev-intro)
;;                                               (find-wrap-intro)

;;; Commentary:

;; 2019: all the `define-key's in this file are now commented out.
;; They were moved to:
;; (find-eevfile "eev-mode.el" "eewrap-anchor")


;; «.ee-template0»		(to "ee-template0")
;; «.ee-S»			(to "ee-S")
;; «.ee-this-line-wrapn»	(to "ee-this-line-wrapn")
;; «.eewrap-anchor»		(to "eewrap-anchor")
;; «.eewrap-escript-block»	(to "eewrap-escript-block")
;; «.eewrap-code-c-d»		(to "eewrap-code-c-d")
;; «.eewrap-debian»		(to "eewrap-debian")
;; «.eewrap-find-fline»		(to "eewrap-find-fline")
;; «.eewrap-eejump»		(to "eewrap-eejump")
;; «.eewrap-man»		(to "eewrap-man")
;; «.eewrap-pdflike»		(to "eewrap-pdflike")
;; «.eewrap-rm/mkdir/cd»	(to "eewrap-rm/mkdir/cd")
;; «.eewrap-sh»			(to "eewrap-sh")
;; «.eepitch»			(to "eepitch")
;; «.eewrap-audiovideo»		(to "eewrap-audiovideo")
;; «.eewrap-zsh»		(to "eewrap-zsh")
;; «.eewrap-two-eepitches»	(to "eewrap-two-eepitches")
;; «.ee-wrap-eewrap»		(to "ee-wrap-eewrap")
;; «.find-eewrap-links»		(to "find-eewrap-links")
;; «.find-eewraptest-links»	(to "find-eewraptest-links")


(require 'eev-template0)      ; (find-eev "eev-template0.el")


(defvar ee-hyperlink-prefix "# "
  "Hyperlinks created by `ee-HS' are prefixed with this.
The best way to change this variable interactively is by running
`M-x ee-hyperlink-prefix'.")

(defvaralias 'ee-H 'ee-hyperlink-prefix)



;;;                 ____  
;;;   ___  ___     / ___| 
;;;  / _ \/ _ \____\___ \ 
;;; |  __/  __/_____|__) |
;;;  \___|\___|    |____/ 
;;;                       
;;; «ee-S» (to ".ee-S")
;; `ee-S' and `ee-HS', for pretty-printing of sexps (mainly for use in
;; `ee-template0').
;; Tests:
;;   (find-estring (ee-S  '(foo   "bar\nplic")))
;;   (find-estring (ee-HS '(foo   "bar\nplic")))
;;   (find-estring (ee-H  "Some string"))
;;         `(setq a ,(ee-add-quote "foo"))
;;         `(setq a ,(ee-add-quote '(+ 1 2)))
;;   (ee-S `(setq a ,(ee-add-quote '(+ 1 2))))
;;
(defun ee-S (object)
  "Convert OBJECT (usually a sexp) into a string, for use in hyperlinks.
Quote newlines to make it fit in a single line.
The result of this function is always a string that can be `read' as Lisp.
The name of this function comes from the \"S\" in `(format \"%S\" <obj>)'."
  (let ((str (let ((print-escape-newlines t)
		   (print-escape-nonascii t) ; isn't escaping esc, \r, etc
		   (print-quoted t))
	       (prin1-to-string object))))
    (replace-regexp-in-string "\r" "\\\\r" str)))

(defun ee-HS (object) (concat ee-hyperlink-prefix (ee-S object)))

(defun ee-H (str) (format "%s%s" ee-hyperlink-prefix str))

(defun ee-needs-quote (obj)
  "Return t when OBJ needs a \"'\"."
  (not (or (numberp obj) (stringp obj) (eq obj nil) (eq obj t) (keywordp obj))))

(defun ee-add-quote (obj)
  "Return OBJ is OBJ is constant; else return 'OBJ."
  (if (ee-needs-quote obj)
      (list 'quote obj)
    obj))

(defun ee-Q (obj)
  (if (ee-needs-quote obj) (format "'%s" (ee-S obj)) (ee-S obj)))

(defun ee-Qrest (rest)
  (mapconcat (lambda (obj) (format " %s" (ee-Q obj))) rest ""))


(defalias 'ee-pp0 'ee-S)

(defun ee-ppp0 (list) (concat "(" (mapconcat 'ee-pp0 list "\n ") ")\n"))




;; «ee-template0» (to ".ee-template0")
;; Moved to: (find-eev "eev-template0.el")




;;;  _   _     _           _ _            
;;; | |_| |__ (_)___      | (_)_ __   ___ 
;;; | __| '_ \| / __|_____| | | '_ \ / _ \
;;; | |_| | | | \__ \_____| | | | | |  __/
;;;  \__|_| |_|_|___/     |_|_|_| |_|\___|
;;;                                       
;; «ee-this-line-wrapn» (to ".ee-this-line-wrapn")
;; The main function in this block is `ee-this-line-wrapn' -
;; all the `eewrap-*' functions defined below call it.

(defun ee-splitn (n str)
"Example: (ee-splitn 3 \"aa bb cc dd ee\")
             --> (\"aa\" \"bb\" \"cc dd ee\")"
  (if (= n 1) (list str)
    (if (string-match "^\\`[ \t]*\\([^ \t]+\\)[ \t]*" str)
	(cons (match-string 1 str)
	      (ee-splitn (- n 1) (substring str (match-end 0))))
      (cons "" (ee-splitn (- n 1) "")))))

(defun ee-this-line-extract ()
  "Delete the contents of the current line and return it as a string."
  (delete-and-extract-region (ee-bol) (ee-eol)))
(defun ee-this-line-extractn (n)
  "Delete the contents of the current line and return it as a list."
  (ee-splitn n (ee-no-properties (ee-this-line-extract))))
(defun ee-this-line-wrapn (n f)
  "Run F on the current line, after splitting it into N strings.
F is a function that receives N arguments and returns a string.
This function extracts the contents of the curren line, splits it,
runs F on the result of the splitting, inserts the result in the
place of what was deleted, and moves down one line.
If an error happens the original contents are not restored; you
have to run an \"undo\"."
  (insert (apply f (ee-this-line-extractn n)))
  (ee-next-line 1))




;;; --------------------
;;; All the standard wrapping functions, bound to M-UPPERCASE keys.
;;; Note that they are listed in alphabetical order below, and that in
;;; each section the higher level functions come first.





;;;  __  __         _                         _                
;;; |  \/  |       / \   _    __ _ _ __   ___| |__   ___  _ __ 
;;; | |\/| |_____ / _ \ (_)  / _` | '_ \ / __| '_ \ / _ \| '__|
;;; | |  | |_____/ ___ \ _  | (_| | | | | (__| | | | (_) | |   
;;; |_|  |_|    /_/   \_(_)  \__,_|_| |_|\___|_| |_|\___/|_|   
;;;                                                            
;; «eewrap-anchor»  (to ".eewrap-anchor")
;; See:  (find-eev-quick-intro "8.3. Creating index/section anchor pairs")
;;       (find-anchors-intro "Creating index/section anchor pairs")
;; Skel: (find-eewrap-links "A" "anchor" "prefix anchor")
;; Test: (find-eewraptest-links "anchor" "# <foo>")

(defun  eewrap-anchor () (interactive)
  (ee-this-line-wrapn 1 'ee-wrap-anchor))
(defun ee-wrap-anchor (line)
  "An internal function used by `eewrap-anchor'."
  (if (string-match "^\\(.*\\)<\\([^<>]*\\)>" line)
      (ee-wrap-anchor0 (match-string 1 line) (match-string 2 line))
    (error "Does not match")))
(defun ee-wrap-anchor0 (prefix anchor)
  "An internal function used by `ee-wrap-anchor'."
  (ee-template0 (ee-tolatin1 "\
{prefix}«.{anchor}»\t(to \"{anchor}\")
{prefix}«{anchor}»  (to \".{anchor}\")")))




;;;  __  __       _                            _       _     _     _ _    
;;; |  \/  |     | |__ _    ___  ___  ___ _ __(_)_ __ | |_  | |__ | | | __
;;; | |\/| |_____| '_ (_)  / _ \/ __|/ __| '__| | '_ \| __| | '_ \| | |/ /
;;; | |  | |_____| |_) |  |  __/\__ \ (__| |  | | |_) | |_  | |_) | |   < 
;;; |_|  |_|     |_.__(_)  \___||___/\___|_|  |_| .__/ \__| |_.__/|_|_|\_\
;;;                                             |_|                       
;; «eewrap-escript-block»  (to ".eewrap-escript-block")
;; See:   (find-eev-quick-intro "8.4. Creating e-script blocks")
;; Skel:  (find-eewrap-links "B" "escript-block" "anchor title")
;; Tests: (find-eewraptest-links "escript-block" "ANCHOR")
;;        (find-eewraptest-links "escript-block" "ANCHOR Some title")

;; (define-key eev-mode-map "\M-B" 'eewrap-escript-block)

(defun  eewrap-escript-block () (interactive)
  (ee-this-line-wrapn 2 'ee-wrap-escript-block))
(defun ee-wrap-escript-block (anchor title &optional date)
  "An internal function used by `ee-wrap-escript-block'."
  (setq date (or date (downcase (format-time-string "%Y%b%d"))))
  (if (equal title "") (setq title anchor))
  (ee-template0 (ee-tolatin1 "\
#####
#
# {title}
# {date}
#
#####

# «.{anchor}»\t(to \"{anchor}\")
# «{anchor}»  (to \".{anchor}\")")))





;;;  __  __        ____                   _                          _ 
;;; |  \/  |      / ___|_    ___ ___   __| | ___        ___       __| |
;;; | |\/| |_____| |   (_)  / __/ _ \ / _` |/ _ \_____ / __|____ / _` |
;;; | |  | |_____| |___ _  | (_| (_) | (_| |  __/_____| (_|_____| (_| |
;;; |_|  |_|      \____(_)  \___\___/ \__,_|\___|      \___|     \__,_|
;;;                                                                    
;; «eewrap-code-c-d»  (to ".eewrap-code-c-d")
;; See:  (find-eev-quick-intro "`M-C'")
;; Skel: (find-eewrap-links "C" "code-c-d" "c d")
;; Test: (find-eewraptest-links "code-c-d" "CCC /DIR/")

(defun  eewrap-code-c-d () (interactive)
  (ee-this-line-wrapn 2 'ee-wrap-code-c-d))
(defun ee-wrap-code-c-d (c d)
  "An internal function used by `eewrap-code-c-d'."
  (ee-template0 "\
\(code-c-d \"{c}\" \"{d}\"\)
;; (find-{c}file \"\")"))


;;;  __  __       ____          _      _     _             
;;; |  \/  |     |  _ \ _    __| | ___| |__ (_) __ _ _ __  
;;; | |\/| |_____| | | (_)  / _` |/ _ \ '_ \| |/ _` | '_ \ 
;;; | |  | |_____| |_| |_  | (_| |  __/ |_) | | (_| | | | |
;;; |_|  |_|     |____/(_)  \__,_|\___|_.__/|_|\__,_|_| |_|
;;;                                                        
;; «eewrap-debian»  (to ".eewrap-debian")
;; See:  (find-wrap-intro "M-D")
;; Skel: (find-eewrap-links "D" "debian" "stem")
;; Test: (find-eewraptest-links "debian" "bash")

(defun  eewrap-debian () (interactive)
  (ee-this-line-wrapn 1 'ee-wrap-debian))
(defun ee-wrap-debian (stem)
  (ee-template0 "\
{ee-H}(find-status   \"{stem}\")
{ee-H}(find-vldifile \"{stem}.list\")
{ee-H}(find-udfile   \"{stem}/\")"))


;;;  __  __       _____     __ _ _      
;;; |  \/  |     |  ___|   / _(_) | ___ 
;;; | |\/| |_____| |_ (_) | |_| | |/ _ \
;;; | |  | |_____|  _| _  |  _| | |  __/
;;; |_|  |_|     |_|  (_) |_| |_|_|\___|
;;;                                     
;; «eewrap-find-fline»  (to ".eewrap-find-fline")
;; See: (find-wrap-intro "<M-F>")
;; Skel: (find-eewrap-links "F" "find-fline" "fname")
;; Test: (find-eewraptest-links "find-fline" "/tmp/foo")

(defun  eewrap-find-fline () (interactive)
  (ee-this-line-wrapn 1 'ee-wrap-find-fline))
(defun ee-wrap-find-fline (fname)
  "An internal function used by `eewrap-find-fline'."
  (ee-HS `(find-fline ,fname)))


;;;  __  __           _                _                       
;;; |  \/  |         | |_    ___  ___ (_)_   _ _ __ ___  _ __  
;;; | |\/| |_____ _  | (_)  / _ \/ _ \| | | | | '_ ` _ \| '_ \ 
;;; | |  | |_____| |_| |_  |  __/  __/| | |_| | | | | | | |_) |
;;; |_|  |_|      \___/(_)  \___|\___|/ |\__,_|_| |_| |_| .__/ 
;;;                                 |__/                |_|    
;;
;; «eewrap-eejump»  (to ".eewrap-eejump")
;; See: (find-eev-quick-intro "7.1. `eejump'")
;;      (find-eev-quick-intro "7.1. `eejump'" "meta-uppercase-j")
;; Old: (find-eejump-intro "Producing `eejump-nnn's and `eejump-nnn*'s")
;; Skel:  (find-eewrap-links "J" "eejump" "n sexp")
;; Tests: (find-eewraptest-links "eejump" "42   (find-fline \"~/TODO\")")
;;        (find-eewraptest-links "eejump" "todo (find-fline \"~/TODO\")")

(defun  eewrap-eejump () (interactive)
  (ee-this-line-wrapn 2 'ee-wrap-eejump))
(defun ee-wrap-eejump (n sexp)
  "An internal function used by `eewrap-eejump'."
  (if (string-match-p "^[0-9]+$" n)
    (if (equal sexp "")
        (ee-template0 "(defun eejump-{n}* () (find-efunction 'eejump-{n}*))")
      (ee-template0   "(defun eejump-{n} () {sexp})"))
    (ee-template0     "(defun {n} () (interactive) {sexp})")))



;;;  __  __       __  __                           
;;; |  \/  |     |  \/  |_   _ __ ___   __ _ _ __  
;;; | |\/| |_____| |\/| (_) | '_ ` _ \ / _` | '_ \ 
;;; | |  | |_____| |  | |_  | | | | | | (_| | | | |
;;; |_|  |_|     |_|  |_(_) |_| |_| |_|\__,_|_| |_|
;;;                                                
;; «eewrap-man»  (to ".eewrap-man")
;; See:  (find-wrap-intro "<M-M>")
;; Skel: (find-eewrap-links "M" "man" "str")
;; Test: (find-eewraptest-links "man" "1 tac")

(defun  eewrap-man () (interactive)
  (ee-this-line-wrapn 1 'ee-wrap-man))
(defun ee-wrap-man (str)
  "An internal function used by `eewrap-man'."
  (ee-HS `(find-man ,str)))



;;;  __  __       ____                _  __ _ _ _        
;;; |  \/  |     |  _ \ _   _ __   __| |/ _| (_) | _____ 
;;; | |\/| |_____| |_) (_) | '_ \ / _` | |_| | | |/ / _ \
;;; | |  | |_____|  __/ _  | |_) | (_| |  _| | |   <  __/
;;; |_|  |_|     |_|   (_) | .__/ \__,_|_| |_|_|_|\_\___|
;;;                        |_|                           
;;
;; «eewrap-pdflike»  (to ".eewrap-pdflike")
;; See:  (find-pdf-like-intro)
;;       (find-pdf-like-intro "`M-P'")
;; Skel: (find-eewrap-links "P" "pdflike" "stem fname")
;; Test: (find-eewraptest-links "pdflike" "o /tmp/o.pdf")

(defun  eewrap-pdflike () (interactive)
  (ee-this-line-wrapn 2 'ee-wrap-pdflike))
(defun ee-wrap-pdflike (stem fname)
  "An internal function used by `eewrap-pdflike'."
  (ee-template0 "\
;; (find-fline {(ee-S (file-name-directory fname))})
\(code-pdf-page \"{stem}\" \"{fname}\")
\(code-pdf-text \"{stem}\" \"{fname}\")
;; \(find-{stem}page)
;; \(find-{stem}text)
"))



;;;  __  __        ___                _  __ _ _ _              _ _       _    
;;; |  \/  |      / _ \ _   _ __   __| |/ _| (_) | _____      | (_)_ __ | | __
;;; | |\/| |_____| | | (_) | '_ \ / _` | |_| | | |/ / _ \_____| | | '_ \| |/ /
;;; | |  | |_____| |_| |_  | |_) | (_| |  _| | |   <  __/_____| | | | | |   < 
;;; |_|  |_|      \__\_(_) | .__/ \__,_|_| |_|_|_|\_\___|     |_|_|_| |_|_|\_\
;;;                        |_|                                                
;;
;; 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))
(defun ee-wrap-pdflike-link (n text)
  "An internal function used by `eewrap-pdflike-link'."
  (format "%s\n%s"
	  (ee-wrap-pdflike-link1 "page" n text)
	  (ee-wrap-pdflike-link1 "text" n text)))
(defun ee-wrap-pdflike-link1 (what n text)
  "An internal function used by `eewrap-pdflike-link'."
  (ee-template0 
   "{ee-H}(find-{ee-page-c}{what} (+ {ee-page-offset} {n}) {(ee-S text)})"))





;;;  __  __       ____                        __         _       _ _      
;;; |  \/  |     |  _ \ _   _ __ _ __ ___    / / __ ___ | | ____| (_)_ __ 
;;; | |\/| |_____| |_) (_) | '__| '_ ` _ \  / / '_ ` _ \| |/ / _` | | '__|
;;; | |  | |_____|  _ < _  | |  | | | | | |/ /| | | | | |   < (_| | | |   
;;; |_|  |_|     |_| \_(_) |_|  |_| |_| |_/_/ |_| |_| |_|_|\_\__,_|_|_|   
;;;                                                                       
;; «eewrap-rm/mkdir/cd»  (to ".eewrap-rm/mkdir/cd")
;; See:  (find-escripts-intro "`M-R'")
;; Skel: (find-eewrap-links "R" "rm/mkdir/cd" "dir")
;; Test: (find-eewraptest-links "rm/mkdir/cd" "/tmp/foo/")

(defun  eewrap-rm/mkdir/cd () (interactive)
  (ee-this-line-wrapn 1 'ee-wrap-rm/mkdir/cd))
(defun ee-wrap-rm/mkdir/cd (dir)
  "An internal function used by `eewrap-rm/mkdir/cd'."
  (ee-template0 "\
# (find-fline \"{dir}\")
rm -Rv {dir}
mkdir  {dir}
cd     {dir}"))


;;;  __  __      ____      __ _           _           _     
;;; |  \/  |    / ___|_   / _(_)_ __   __| |      ___| |__  
;;; | |\/| |____\___ (_) | |_| | '_ \ / _` |_____/ __| '_ \ 
;;; | |  | |_____|__) |  |  _| | | | | (_| |_____\__ \ | | |
;;; |_|  |_|    |____(_) |_| |_|_| |_|\__,_|     |___/_| |_|
;;;                                                         
;; «eewrap-sh»  (to ".eewrap-sh")
;; See: (find-wrap-intro "<M-S>")
;; Skel: (find-eewrap-links "R" "sh" "str")
;; Test: (find-eewraptest-links "sh" "dict smop")

(defun  eewrap-sh () (interactive)
  (ee-this-line-wrapn 1 'ee-wrap-sh))
(defun ee-wrap-sh (str)
  "An internal function used by `eewrap-sh'."
  (ee-HS `(find-sh ,str)))

(defun  eewrap-sh0 () (interactive)
  (ee-this-line-wrapn 1 'ee-wrap-sh0))
(defun ee-wrap-sh0 (str)
  "An internal function used by `eewrap-sh0'."
  (ee-HS `(find-sh0 ,str)))


;;;  __  __     _____                    _ _       _     
;;; |  \/  |   |_   _|    ___  ___ _ __ (_) |_ ___| |__  
;;; | |\/| |_____| |(_)  / _ \/ _ \ '_ \| | __/ __| '_ \ 
;;; | |  | |_____| | _  |  __/  __/ |_) | | || (__| | | |
;;; |_|  |_|     |_|(_)  \___|\___| .__/|_|\__\___|_| |_|
;;;                               |_|                    
;;
;; «eepitch»  (to ".eepitch")
;; Moved to: (find-eev "eepitch.el" "eewrap-eepitch")



;;;  __  __    __     __                   _ _            _     _            
;;; |  \/  |   \ \   / /    __ _ _   _  __| (_) _____   _(_) __| | ___  ___  
;;; | |\/| |____\ \ / (_)  / _` | | | |/ _` | |/ _ \ \ / / |/ _` |/ _ \/ _ \ 
;;; | |  | |_____\ V / _  | (_| | |_| | (_| | | (_) \ V /| | (_| |  __/ (_) |
;;; |_|  |_|      \_/ (_)  \__,_|\__,_|\__,_|_|\___/ \_/ |_|\__,_|\___|\___/ 
;;;                                                                          
;; «eewrap-audiovideo»  (to ".eewrap-audiovideo")
;; See: (find-audiovideo-intro)
;; Skel: (find-eewrap-links "V" "audiovideo" "stem fname")
;; Test: (find-eewraptest-links "audiovideo" "ovideo /tmp/o.mp4")

(defun  eewrap-audiovideo () (interactive)
  (ee-this-line-wrapn 2 'ee-wrap-audiovideo))
(defun ee-wrap-audiovideo (stem fname)
  "An internal function used by `eewrap-audiovideo'."
  (ee-template0 "\
;; (find-fline {(ee-S (file-name-directory fname))})
;; (find-audio \"{fname}\")
;; (find-video \"{fname}\")
(code-audio \"{stem}\" \"{fname}\")
(code-video \"{stem}\" \"{fname}\")
;; (find-{stem})
;; (find-{stem} \"0:00\")
;; (find-{stem} t)
;; (eev-avadj-mode 1)
"))



;;;  __  __      _____     __ _           _              _     
;;; |  \/  |    |__  /_   / _(_)_ __   __| |     _______| |__  
;;; | |\/| |_____ / /(_) | |_| | '_ \ / _` |____|_  / __| '_ \ 
;;; | |  | |_____/ /_ _  |  _| | | | | (_| |_____/ /\__ \ | | |
;;; |_|  |_|    /____(_) |_| |_|_| |_|\__,_|    /___|___/_| |_|
;;;                                                            
;; «eewrap-zsh»  (to ".eewrap-zsh")
;; (define-key eev-mode-map "\M-Z" 'eewrap-zsh)
;; Skel: (find-eewrap-links "Z" "zsh" "str")
;; Test: (find-eewraptest-links "zsh" "echo $SHELL")

(defun  eewrap-zsh () (interactive)
  (ee-this-line-wrapn 1 'ee-wrap-zsh))
(defun ee-wrap-zsh (str)
  "An internal function used by `eewrap-zsh'."
  (ee-HS `(find-zsh ,str)))



;;;  __  __         _  _       ____                    _ _       _               
;;; |  \/  |      _| || |_ _  |___ \    ___  ___ _ __ (_) |_ ___| |__   ___  ___ 
;;; | |\/| |_____|_  ..  _(_)   __) |  / _ \/ _ \ '_ \| | __/ __| '_ \ / _ \/ __|
;;; | |  | |_____|_      _|_   / __/  |  __/  __/ |_) | | || (__| | | |  __/\__ \
;;; |_|  |_|       |_||_| (_) |_____|  \___|\___| .__/|_|\__\___|_| |_|\___||___/
;;;                                             |_|                              
;;
;; «eewrap-two-eepitches»  (to ".eewrap-two-eepitches")
;; See: (find-multiwindow-intro "4. Several eepitch targets")
;;      (find-multiwindow-intro "7. Eepitch blocks for two targets")
;; Skel: (find-eewrap-links "#" "two-eepitches" "b c")
;; Test: (find-eewraptest-links "two-eepitches" "shell python")

(defun  eewrap-two-eepitches () (interactive)
  (ee-this-line-wrapn 2 'ee-wrap-two-eepitches))
(defun ee-wrap-two-eepitches (b c)
  "An internal function used by `eewrap-two-eepitches'."
  (ee-template0 "\
* (find-3EE '(eepitch-{b}) '(eepitch-{c}))
* (find-3ee '(eepitch-{b}) '(eepitch-{c}))
* (eepitch-{b})
* (eepitch-{c})
"))






;;;                                    /\ ____  
;;;   ___  _____      ___ __ __ _ _ __|/\|___ \ 
;;;  / _ \/ _ \ \ /\ / / '__/ _` | '_ \    __) |
;;; |  __/  __/\ V  V /| | | (_| | |_) |  / __/ 
;;;  \___|\___| \_/\_/ |_|  \__,_| .__/  |_____|
;;;                              |_|            
;;
;; «ee-wrap-eewrap»  (to ".ee-wrap-eewrap")
;; See: (find-eev "eev-tlinks.el" "find-find-links-links-new")
;;      (find-wrap-intro "eewrap-eewrap")
;; This is somewhat similar to `find-find-links-links',
;; but it is MUCH more primitive - consider it a demo!

(defun  eewrap-eewrap () (interactive)
  "Obsolete! Superseded by `find-eewrap-links'!"
  (ee-this-line-wrapn 3 'ee-wrap-eewrap))

(defun ee-wrap-eewrap (C stem args)
  "An internal function used by `find-eewrap-links'."
  (let ((n (length (ee-split args))))
    (ee-template0 "
;; (find-efunction 'eewrap-{stem})

;; M-{C}: {stem}
;; (find-eev \"eev-mode.el\" \"eev-mode-map-set\")
;; (find-eev \"eev-mode.el\" \"eev-mode-map-set\" \"M-{C}\")
;; (find-eev \"eev-mode.el\" \"eev-mode-map-set\" \"M-{C}\" \"eewrap-{stem}\")
;; (define-key eev-mode-map \"\\M-{C}\" 'eewrap-{stem})

;; <eewrap-{stem}>
;; Skel: (find-eewrap-links \"{C}\" \"{stem}\" \"{args}\")
;; Test: (find-eewraptest-links \"{stem}\" \"{args}\")

(defun  eewrap-{stem} () (interactive)
  (ee-this-line-wrapn {n} 'ee-wrap-{stem}))
(defun ee-wrap-{stem} ({args})
  \"An internal function used by `eewrap-{stem}'.\"
  (ee-template0 \"\\
{<}(ee-HS `(find-{stem} ,{args})){>}\"))\n")))


;; «find-eewrap-links» (to ".find-eewrap-links")
;; A more standard way to create `eewrap-*' functions.
;; Skel: (find-find-links-links-new "eewrap" "C stem args" "n")
;; Test: (find-eewrap-links)
;;
(defun find-eewrap-links (&optional C stem args &rest pos-spec-list)
  "Visit a temporary buffer containing hyperlinks for eewrap."
  (interactive)
  (setq C    (or C    "{C}"))
  (setq stem (or stem "{stem}"))
  (setq args (or args "{args}"))
  (apply
   'find-elinks-elisp
   `((find-eewrap-links ,C ,stem ,args ,@pos-spec-list)
     ;; Convention: the first sexp always regenerates the buffer.
     (find-efunction 'find-eewrap-links)
     ,(ee-wrap-eewrap C stem args)
     )
   pos-spec-list))


;; «find-eewraptest-links»  (to ".find-eewraptest-links")
;; See:   (find-wrap-intro "6. All wrapping functions")
;; Skel:  (find-find-links-links-new "eewraptest" "stem line" "")
;; Tests: (find-eewraptest-links "eejump" "42   (find-fline \"~/TODO\")")
;;        (find-eewraptest-links "eejump" "todo (find-fline \"~/TODO\")")
;;
(defun find-eewraptest-links (&optional stem line &rest pos-spec-list)
"Visit a temporary buffer containing hyperlinks for eewraptest."
  (interactive)
  (setq stem (or stem "{stem}"))
  (setq line (or line "{line}"))
  (apply
   'find-elinks-elisp
   `((find-eewraptest-links ,stem ,line ,@pos-spec-list)
     ;; Convention: the first sexp always regenerates the buffer.
     (find-efunction 'find-eewraptest-links)
     ""
     ,(ee-template0 "\
;; (eek \"2*<down> <<eewrap-{stem}>>\")
;; (find-efunction 'eewrap-{stem})
{line}
")
     )
   pos-spec-list))




;;;                                  _   
;;;   ___ ___  _ __ ___  _ __   __ _| |_ 
;;;  / __/ _ \| '_ ` _ \| '_ \ / _` | __|
;;; | (_| (_) | | | | | | |_) | (_| | |_ 
;;;  \___\___/|_| |_| |_| .__/ \__,_|\__|
;;;                     |_|              

;; (defalias    'ee-H 'ee-hyperlink-prefix)
;; (defalias    'ee-S 'ee-pp0)

(provide 'eev-wrap)





;; Local Variables:
;; coding:            utf-8-unix
;; no-byte-compile:   t
;; End: