branch: externals/eev commit d2dc3d65163462e76ebc2631af6506b89efe906e Author: Eduardo Ochs <eduardoo...@gmail.com> Commit: Eduardo Ochs <eduardoo...@gmail.com>
Moved `find-here-links' and friends to the file find-hlinks.el. --- ChangeLog | 29 ++++ VERSION | 4 +- eev-code.el | 1 + eev-elinks.el | 246 +++----------------------------- eev-hlinks.el | 439 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ eev-intro.el | 30 +++- eev-load.el | 3 +- 7 files changed, 522 insertions(+), 230 deletions(-) diff --git a/ChangeLog b/ChangeLog index bb15ab2..8299f11 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,35 @@ 2020-01-08 Eduardo Ochs <eduardoo...@gmail.com> + * eev-hlinks.el: new file. + (ee-buffer-re, ee-buffer-eq, ee-buffer-help0) + (ee-buffer-help-re0, ee-buffer-help, ee-grep-bufferp) + (ee-man-bufferp, ee-rcirc-bufferp, ee-info-bufferp) + (ee-dired-bufferp, ee-wdired-bufferp, ee-w3m-bufferp) + (ee-custom-bufferp, ee-epackages-bufferp, ee-intro-bufferp) + (ee-freenode-bufferp, ee-ecolors-bufferp, ee-efaces-bufferp) + (ee-pdftext-bufferp, ee-efunctiondescr-bufferp) + (ee-find-efunctiondescr-links, ee-evardescr-bufferp) + (ee-find-evardescr-links, ee-efunctiondescr-re, ee-evardescr-re) + (ee-efacedescr-re, ee-efacedescr-bufferp) + (ee-find-efacedescr-links, ee-epackage-re, ee-epackage-bufferp) + (ee-find-epackage-links, ee-man-re, ee-find-man-links) + (ee-custom-re, ee-find-custom-links, ee-file-bufferp) + (ee-find-efaces-links, ee-find-ecolors-links) + (ee-find-epackages-links, ee-find-pdftext-links) + (ee-find-here-links, find-here-links-test, ee-find-here-links0) + (find-here-links, find-here-links-beginner) + (ee-window-configuration-before-M-h-M-3, find-here-links-3) + (find-here-links-1): all these functions and variables were moved + from eev-elinks.el to eev-hlinks.el. + + * eev-intro.el (find-links-conv-intro): mention eev-hlinks.el in + the classification in the section "3. Classification". + * eev-tlinks.el (find-find-links-links-new): new function. + (find-fossil-links, ee-fossil-url-stem): new functions. + + * eev-code.el: added a `(code-c-d "cl" ...)', for the Common Lisp + extensions. 2020-01-07 Eduardo Ochs <eduardoo...@gmail.com> diff --git a/VERSION b/VERSION index 90fff04..cf5b4d5 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Wed Jan 8 22:25:42 GMT 2020 -Wed Jan 8 19:25:42 -03 2020 +Tue Feb 11 18:57:39 GMT 2020 +Tue Feb 11 15:57:39 -03 2020 diff --git a/eev-code.el b/eev-code.el index 1ed79d7..ef9b638 100644 --- a/eev-code.el +++ b/eev-code.el @@ -328,6 +328,7 @@ Note: the POS-SPEC-LIST arguments are currently not used." (code-c-d "e" ee-emacs-lisp-directory "emacs" :gz) ; (find-enode "Top") (code-c-d "el" ee-emacs-lisp-directory "elisp" :gz) ; (find-elnode "Top") (code-c-d "eli" ee-emacs-lisp-directory "eintr" :gz) ; (find-elinode "Top") +(code-c-d "cl" (ee-efile "emacs-lisp/") "cl" :gz) ; (find-clnode "Top") (code-c-d "eleim" ee-emacs-leim-directory :gz) (code-c-d "equail" (ee-eleimfile "quail/") :gz) (code-c-d "eetc" data-directory :gz) diff --git a/eev-elinks.el b/eev-elinks.el index edd1f7b..7c8c5db 100644 --- a/eev-elinks.el +++ b/eev-elinks.el @@ -77,13 +77,23 @@ ;; «.find-color-links» (to "find-color-links") ;; «.find-epackage-links» (to "find-epackage-links") +;; «.find-code-pdf-links» (to "find-code-pdf-links") +;; «.find-pdf-links» (to "find-pdf-links") +;; «.find-code-audiovideo-links» (to "find-code-audiovideo-links") + + + +;; The functions in these sections were moved to: +;; (find-eev "eev-hlinks.el") +;; ;; «.find-here-links» (to "find-here-links") ;; «.find-here-links-beginner» (to "find-here-links-beginner") ;; «.find-here-links-3» (to "find-here-links-3") +;; «find-here-links» (to ".find-here-links") +;; «find-here-links-beginner» (to ".find-here-links-beginner") +;; «find-here-links-3» (to ".find-here-links-3") + -;; «.find-code-pdf-links» (to "find-code-pdf-links") -;; «.find-pdf-links» (to "find-pdf-links") -;; «.find-code-audiovideo-links» (to "find-code-audiovideo-links") @@ -279,7 +289,7 @@ This is an internal function used by `find-efunction-links' and ;;; |_| |_|_| |_|\__,_| \___| \_/ \__,_|_| |_|\__,_|_.__/|_|\___| ;;; ;; «find-evariable-links» (to ".find-evariable-links") -;; (find-find-links-links "\\M-v" "evariable" "var") +;; Skel: (find-find-links-links-old "\\M-v" "evariable" "var") ;; A test: (find-evariable-links 'line-move-visual) ;; (eek "M-h M-v line-move-visual") @@ -314,7 +324,7 @@ This is an internal function used by `find-efunction-links' and ;;; |___/ ;; ;; «find-ekey-links» (to ".find-ekey-links") -;; (find-find-links-links "\\M-k" "ekey" "key") +;; Skel: (find-find-links-links-old "\\M-k" "ekey" "key") ;; ;; The functions in this section generate buffers with hyperlinks ;; about a key sequence. Like this, @@ -745,7 +755,7 @@ when this is true remove the prefix D from FNAME, and put the sexp ;;; |_| |_|_| |_|\__,_| |_| |_|_|\___| |_|_|_| |_|_|\_\___/ ;;; ;; «find-file-links» (to ".find-file-links") -;; (find-find-links-links "f" "file" "fname") +;; Skel: (find-find-links-links-old "f" "file" "fname") ;; A test: (find-file-links "~/tmp/foo") ;; Moved to eev-mode.el: @@ -793,7 +803,7 @@ when this is true remove the prefix D from FNAME, and put the sexp ;;; |___/ |_| ;; ;; «find-grep-links» (to ".find-grep-links") -;; (find-find-links-links "\\M-g" "grep" "") +;; Skel: (find-find-links-links-old "\\M-g" "grep" "") ;; Tests: ;; (ee-find-grep-commands) ;; (ee-find-grep-functions "~/eev-current/") @@ -853,7 +863,7 @@ when this is true remove the prefix D from FNAME, and put the sexp ;;; |_| |_|_| |_|\__,_| |_| |_| |_|\__,_|\___|_| \___/ ;;; ;; «find-ekbmacro-links» (to ".find-ekbmacro-links") -;; (find-find-links-links "M" "macro" "") +;; Skel: (find-find-links-links-old "M" "macro" "") ;; (find-efunction 'find-ekbmacro-links) ;; Moved to eev-mode.el: @@ -911,7 +921,7 @@ when this is true remove the prefix D from FNAME, and put the sexp (defun ee-region-or-last-kill () (or (ee-region) (ee-last-kill))) -;; (find-find-links-links "\\M-p" "pdflike-page" "page bufname offset") +;; 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) @@ -1013,7 +1023,7 @@ See the comments in the source code." ;; (find-templates-intro) ;; «find-eface-links» (to ".find-eface-links") -;; (find-find-links-links "\\M-s" "eface" "face-symbol") +;; Skel: (find-find-links-links-old "\\M-s" "eface" "face-symbol") ;; A test: (find-eface-links 'bold) ;; Moved to eev-mode.el: @@ -1056,7 +1066,7 @@ See the comments in the source code." ;;; |_| |_|_| |_|\__,_| \___|\___\___/|_|\___/|_| |_|_|_| |_|_|\_\___/ ;;; ;; «find-color-links» (to ".find-color-links") -;; (find-find-links-links "c" "color" "initialcolor") +;; Skel: (find-find-links-links-old "c" "color" "initialcolor") ;; Tests: ;; (find-ecolor-links) ;; (find-ecolor-links "sienna") @@ -1160,220 +1170,6 @@ This is an internal function used by `ee-find-epackage-links'." -;;; __ _ _ _ _ _ _ -;;; / _(_)_ __ __| | | |__ ___ _ __ ___ | (_)_ __ | | _____ -;;; | |_| | '_ \ / _` |_____| '_ \ / _ \ '__/ _ \_____| | | '_ \| |/ / __| -;;; | _| | | | | (_| |_____| | | | __/ | | __/_____| | | | | | <\__ \ -;;; |_| |_|_| |_|\__,_| |_| |_|\___|_| \___| |_|_|_| |_|_|\_\___/ -;;; -;; «find-here-links» (to ".find-here-links") -;; See: (find-eev-quick-intro "`M-h M-h'") - -;; (find-efunction 'find-grep-links) -;; (find-efunction 'find-einfo-links) -;; (find-efunction 'find-file-links) -;; (find-find-links-links "\\M-h" "here" "") -;; (find-efunction 'find-ecolors) - -;; Moved the key binding to: -;; (find-eevfile "eev-mode.el" "\\M-h\\M-h") -;; (define-key eev-mode-map "\M-h\M-h" 'find-here-links) - -;; TODO: support cases like these: -;; (find-efunctiondescr 'condition-case) - -;; Some tools for detecting which kind of buffer we're in. -(defun ee-buffer-re (re) - (if (string-match re (buffer-name)) - (match-string 1 (buffer-name)))) -(defun ee-buffer-eq (str) (string= str (buffer-name))) - -(defun ee-buffer-help0 () (ee-buffer-eq "*Help*")) -(defun ee-buffer-help-re0 (re n) - (if (ee-buffer-help0) - (save-excursion - (goto-char (point-min)) - (if (looking-at re) (match-string n))))) - -(defun ee-buffer-help (re n) (intern (or (ee-buffer-help-re0 re n) "nil"))) - -;; By major mode -(defun ee-grep-bufferp () (eq major-mode 'grep-mode)) -(defun ee-man-bufferp () (eq major-mode 'Man-mode)) -(defun ee-rcirc-bufferp () (eq major-mode 'rcirc-mode)) -(defun ee-info-bufferp () (eq major-mode 'Info-mode)) -(defun ee-dired-bufferp () (eq major-mode 'dired-mode)) -(defun ee-wdired-bufferp () (eq major-mode 'wdired-mode)) -(defun ee-w3m-bufferp () (eq major-mode 'w3m-mode)) -(defun ee-custom-bufferp () (eq major-mode 'Custom-mode)) -(defun ee-epackages-bufferp () (eq major-mode 'package-menu-mode)) - -;; By buffer name -(defun ee-intro-bufferp () (ee-buffer-re "^\\*(find-\\(.*\\)-intro)\\*$")) -(defun ee-freenode-bufferp () (ee-buffer-re "^\\(.*\\).freenode\\.net")) -(defun ee-ecolors-bufferp () (ee-buffer-eq "*Colors*")) -(defun ee-efaces-bufferp () (ee-buffer-eq "*Faces*")) -(defun ee-pdftext-bufferp () (ee-buffer-re "^pdftotext")) - -;; By buffer name (when it is "*Help*") -(defvar ee-efunctiondescr-re - "^\\([^ \t\n]+\\) is a[^\t\n]*\\(function\\|Lisp macro\\|special form\\)") -(defun ee-efunctiondescr-bufferp () (ee-buffer-help ee-efunctiondescr-re 1)) -(defun ee-find-efunctiondescr-links () - (let ((f (ee-efunctiondescr-bufferp))) - `((find-efunction-links ',f) - (find-efunctiondescr ',f)))) - -(defvar ee-evardescr-re "^\\([^ \t\n]+\\) is a variable") -(defun ee-evardescr-bufferp () (ee-buffer-help ee-evardescr-re 1)) -(defun ee-find-evardescr-links () - (let ((v (ee-evardescr-bufferp))) - `((find-evariable-links ',v) - (find-evardescr ',v)))) - -(defvar ee-efacedescr-re "^Face: \\([^ \t\n]+\\)") -(defun ee-efacedescr-bufferp () (ee-buffer-help ee-efacedescr-re 1)) -(defun ee-find-efacedescr-links () - (let ((f (ee-efacedescr-bufferp))) - `((find-eface-links ',f) - (find-efacedescr ',f)))) - -(defvar ee-epackage-re "^\\([^ \t\n]+\\) is a[ -~]+ package") -(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)))) - -;; By buffer name (when the mode is man) -(defvar ee-man-re "^\\*Man \\(.*\\)\\*$") -(defun ee-find-man-links () - (let ((mp (ee-buffer-re ee-man-re))) - `((find-man ,mp)))) - -(defvar ee-custom-re "^\\*Customize Group: \\(.*\\)\\*$") -(defun ee-find-custom-links () - (let* ((name (ee-buffer-re ee-custom-re)) - (symbol (intern (downcase (replace-regexp-in-string " " "-" name))))) - `((find-customizegroup ',symbol)))) - -;; Other cases -(defun ee-file-bufferp () buffer-file-name) - - - -(defun ee-find-efaces-links () `((find-efaces))) -(defun ee-find-ecolors-links () `((find-ecolors))) -(defun ee-find-epackages-links () `((find-epackages))) -(defun ee-find-pdftext-links () (ee-pdflike-page-links)) - -;; to to: -;; ee-find-w3m-links -;; ee-find-ecolor-links -;; - -(defun ee-find-here-links () - (cond ;; by major mode - ((ee-info-bufferp) (cons "" (ee-find-info-links))) ; M-h M-i - ((ee-man-bufferp) (cons "" (ee-find-man-links))) ; ? - ((ee-grep-bufferp) (cons "" (ee-find-grep-links))) ; M-h M-g - ((ee-w3m-bufferp) (cons "" (ee-find-w3m-links))) ; M-h M-w - ((ee-dired-bufferp) (cons "" (ee-find-file-links))) ; M-h f - ((ee-wdired-bufferp) (cons "" (ee-find-file-links))) ; M-h f - ((ee-custom-bufferp) (cons "" (ee-find-custom-links))) ; ? - ((ee-epackages-bufferp) (cons "" (ee-find-epackages-links))) ; ? - ;; by buffer name - ((ee-intro-bufferp) (cons "" (ee-find-intro-links))) ; M-h M-i - ((ee-freenode-bufferp) (cons "" (ee-find-freenode-links))) ; ? - ((ee-ecolors-bufferp) (cons "" (ee-find-ecolors-links))) ; ? - ((ee-efaces-bufferp) (cons "" (ee-find-efaces-links))) ; ? - ((ee-pdftext-bufferp) (cons "" (ee-find-pdftext-links))) ; ? - ;; by buffer name, when it is "*Help*" - ((ee-efunctiondescr-bufferp) (cons "" (ee-find-efunctiondescr-links))) - ((ee-efacedescr-bufferp) (cons "" (ee-find-efacedescr-links))) - ((ee-evardescr-bufferp) (cons "" (ee-find-evardescr-links))) - ((ee-epackage-bufferp) (cons "" (ee-find-epackage-links))) - ;; other cases - ((ee-file-bufferp) (cons "" (ee-find-file-links))) ; M-h f - (t (list "" "Not implemented!" "See:" - '(find-efunction 'ee-find-here-links))) - )) - -(defun find-here-links-test (sexp) -"See: (find-links-intro \"`find-here-links'\")" - (find-wset "13o_2o_o" sexp '(find-here-links))) - -;; (find-man "1 cat") -;; (progn (find-man "1 cat") (buffer-name)) -;; (find-eevfile "eev-rcirc.el") - -(defun ee-find-here-links0 () - `(,(ee-H "See: ") - (find-eev-quick-intro "4.1. `find-here-links'") - (find-emacs-keys-intro "1. Basic keys (eev)" "M-h M-h") - (find-here-links-intro "4. `find-here-links-3'") - )) - -;; (find-find-links-links "\\M-h" "here" "") -;; -(defun find-here-links (&rest pos-spec-list) -"Visit a temporary buffer containing hyperlinks pointing to here." - (interactive) - (apply 'find-elinks - `(;; The first line of a find-here-links buffer DOES NOT - ;; regenerates the buffer - instead the first lines point to - ;; help pages. - ,@(ee-find-here-links0) - ,@(ee-find-here-links) - ) - pos-spec-list)) - -;; Test: (find-here-links) -;; (progn (find-enode "Screen") (find-here-links)) - - - -;; «find-here-links-beginner» (to ".find-here-links-beginner") -;; This is a hack for beginners that is explained in a tutorial. See: -;; (find-refining-intro "4. A tip for beginners") -;; (find-refining-intro "4. A tip for beginners" "find-here-links-beginner") -;; -(defun find-here-links-beginner (&optional arg) - "A variant of `find-here-links' that may create a three-window setting." - (interactive "P") - (if arg (find-here-links-3) (find-here-links))) - -;; «find-here-links-3» (to ".find-here-links-3") -;; See: (find-here-links-intro "4. `find-here-links-3'") -;; (find-here-links-intro "5. `find-here-links-1'") -;; -(defvar ee-window-configuration-before-M-h-M-3 nil) - -(defun find-here-links-3 () - "A variant of `find-here-links' that creates a three-window setting. -Before creating the three windows this function tries to save the -current window configuration to the variable -`ee-window-configuration-before-M-h-M-3', but if that variable is -not nil we abort instead of overwriting it. -See: (find-here-links-intro \"4. `find-here-links-3'\")" - (interactive) - (if ee-window-configuration-before-M-h-M-3 - (let ((overwrite - (yes-or-no-p "Overwrite `ee-window-configuration-before-M-h-M-3'? "))) - (if (not overwrite) - (error)))) - (setq ee-window-configuration-before-M-h-M-3 - (current-window-configuration)) - (find-wset "13_o2_o_coo" nil '(find-here-links) '(eejump-1))) - -(defun find-here-links-1 () - "Restore the window configuration before `find-here-links-3'. -See: (find-here-links-intro \"5. `find-here-links-1'\")" - (interactive) - (set-window-configuration ee-window-configuration-before-M-h-M-3) - (setq ee-window-configuration-before-M-h-M-3 nil)) - - - diff --git a/eev-hlinks.el b/eev-hlinks.el new file mode 100644 index 0000000..320bf9d --- /dev/null +++ b/eev-hlinks.el @@ -0,0 +1,439 @@ +;;; eev-hlinks.el --- `find-here-links' and variants. + +;; Copyright (C) 2020 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: 2020jan09 +;; Keywords: e-scripts +;; +;; Latest version: <http://angg.twu.net/eev-current/eev-hlinks.el> +;; htmlized: <http://angg.twu.net/eev-current/eev-hlinks.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 file implements `find-here-links', its variants for beginners, +;; and the many low-level functions that are needed to make them work. +;; +;; `find-here-links' generates a temporary buffer with links to +;; "here". There are several kinds of "here"s - see: +;; +;; (find-here-links-intro "3. `find-here-links'") +;; (find-here-links-intro "3. `find-here-links'" "several kinds") +;; +;; The "here" buffer is sometimes called the "target" buffer. See: +;; +;; (find-here-links-intro "4. `find-here-links-3'") +;; (find-here-links-intro "4. `find-here-links-3'" "terminology") +;; +;; For each kind of "here" we have a "test function" that tests if the +;; current buffer is of that kind of here and a "links function" that +;; generates links for that kind of here. Here's the conventions on +;; their names. A sexp like +;; +;; (find-man "1 date") +;; +;; opens a manpage buffer; the test function and the links function +;; for manpage buffers are: +;; +;; (ee-man-bufferp) +;; (ee-find-man-links) +;; +;; They all have the same stem - "man" - but different prefixes and +;; suffixes. + +;; TODO: Some of the `ee-find-*-links' functions are defined in other +;; files. Which ones? Give examples! +;; +;; (find-eapropos "ee-find-.*-links") + + + +;; The main workhorse function in this file is `ee-find-here-links', +;; that _currently_ uses a big `cond' to run these test functions in a +;; certain order until one of them returns true, and then it returns +;; the result of the links function associated to that test (and to +;; that kind of "here"). But I am trying to rewrite it... + + + +;; «.ee-types-of-here» (to "ee-types-of-here") +;; «.tests-and-links» (to "tests-and-links") +;; «.ee-which-here-tests» (to "ee-which-here-tests") +;; +;; «.find-here-links» (to "find-here-links") +;; «.find-here-links-beginner» (to "find-here-links-beginner") +;; «.find-here-links-3» (to "find-here-links-3") + + + + + +;;; __ _ _ _ _ _ _ +;;; / _(_)_ __ __| | | |__ ___ _ __ ___ | (_)_ __ | | _____ +;;; | |_| | '_ \ / _` |_____| '_ \ / _ \ '__/ _ \_____| | | '_ \| |/ / __| +;;; | _| | | | | (_| |_____| | | | __/ | | __/_____| | | | | | <\__ \ +;;; |_| |_|_| |_|\__,_| |_| |_|\___|_| \___| |_|_|_| |_|_|\_\___/ +;;; +;; «find-here-links» (to ".find-here-links") +;; See: (find-eev-quick-intro "`M-h M-h'") + +;; (find-efunction 'find-grep-links) +;; (find-efunction 'find-einfo-links) +;; (find-efunction 'find-file-links) +;; (find-find-links-links "\\M-h" "here" "") +;; (find-efunction 'find-ecolors) + +;; Moved the key binding to: +;; (find-eevfile "eev-mode.el" "\\M-h\\M-h") +;; (define-key eev-mode-map "\M-h\M-h" 'find-here-links) + +;; TODO: support cases like these: +;; (find-efunctiondescr 'condition-case) + + + + + + +;;; _ __ _ +;;; | |_ _ _ _ __ ___ ___ ___ / _| | |__ ___ _ __ ___ +;;; | __| | | | '_ \ / _ \/ __|_____ / _ \| |_ _____| '_ \ / _ \ '__/ _ \ +;;; | |_| |_| | |_) | __/\__ \_____| (_) | _|_____| | | | __/ | | __/ +;;; \__|\__, | .__/ \___||___/ \___/|_| |_| |_|\___|_| \___| +;;; |___/|_| +;; +;; «ee-types-of-here» (to ".ee-types-of-here") +;; New code. Not working yet. Commented out. +;; Uglyness: `ee-add-type-of-here' runs `sort' too often. +;; See: (find-eev "eev-code.el" "alists") +;; (find-elnode "Sequence Functions" "Function: sort ") + +' +(progn + +(setq ee-types-of-here nil) + +(defun ee-sort-types-of-here () + (setq ee-types-of-here + (sort ee-types-of-here + (lambda (a b) (string< (car a) (car b)))))) + +(defun ee-add-type-of-here (priority testcode linkscode) + (let* ((label (format "%s %s" priority (ee-S testcode)))) + (setq ee-types-of-here + (ee-aset ee-types-of-here label (list testcode linkscode))))) + +(defun ee-add-toh-major (testcode linkscode) + (ee-add-type-of-here "20 major" testcode linkscode)) + +(defun ee-add-toh-bname (testcode linkscode) + (ee-add-type-of-here "40 bname" testcode linkscode)) + +(defun ee-add-toh-bhelp (testcode linkscode) + (ee-add-type-of-here "60 help " testcode linkscode)) + +(defun ee-add-toh-other (testcode linkscode) + (ee-add-type-of-here "80 other" testcode linkscode)) + +;; By major mode: +(ee-add-toh-major '(ee-info-bufferp) '(ee-find-info-links)) +(ee-add-toh-major '(ee-man-bufferp) '(ee-find-man-links)) +(ee-add-toh-major '(ee-grep-bufferp) '(ee-find-grep-links)) +(ee-add-toh-major '(ee-w3m-bufferp) '(ee-find-w3m-links)) +(ee-add-toh-major '(ee-dired-bufferp) '(ee-find-file-links)) +(ee-add-toh-major '(ee-wdired-bufferp) '(ee-find-file-links)) +(ee-add-toh-major '(ee-custom-bufferp) '(ee-find-custom-links)) +(ee-add-toh-major '(ee-epackages-bufferp) '(ee-find-epackages-links)) + +;; By buffer name: +(ee-add-toh-bname '(ee-intro-bufferp) '(ee-find-intro-links)) +(ee-add-toh-bname '(ee-ecolors-bufferp) '(ee-find-ecolors-links)) +(ee-add-toh-bname '(ee-efaces-bufferp) '(ee-find-efaces-links)) +;; (ee-add-toh-bname '(ee-freenode-bufferp) '(ee-find-freenode-links)) +;; (ee-add-toh-bname '(ee-pdftext-bufferp) '(ee-find-pdftext-links)) + +;; When the buffer name is "*Help*" we parse the first line: +(ee-add-toh-bhelp '(ee-efunctiondescr-bufferp) '(ee-find-efunctiondescr-links)) +(ee-add-toh-bhelp '(ee-efacedescr-bufferp) '(ee-find-efacedescr-links)) +(ee-add-toh-bhelp '(ee-evardescr-bufferp) '(ee-find-evardescr-links)) +(ee-add-toh-bhelp '(ee-epackage-bufferp) '(ee-find-epackage-links)) + +;; Other cases: +(ee-add-toh-other '(ee-file-bufferp) '(ee-find-file-links)) + +(ee-sort-types-of-here) + +;; Inspect the data structures: +;; (find-epp ee-types-of-here) +;; (find-estring (mapconcat 'car ee-types-of-here "\n")) + + +) + + + + + + +;;; _ _ _ _ _ _ +;;; | |_ ___ ___| |_ ___ __ _ _ __ __| | | (_)_ __ | | _____ +;;; | __/ _ \/ __| __/ __| / _` | '_ \ / _` | | | | '_ \| |/ / __| +;;; | || __/\__ \ |_\__ \ | (_| | | | | (_| | | | | | | | <\__ \ +;;; \__\___||___/\__|___/ \__,_|_| |_|\__,_| |_|_|_| |_|_|\_\___/ +;;; +;; «tests-and-links» (to ".tests-and-links") +;; For each kind of here we have: +;; a) a test function that tests if the current buffer is of that kind, +;; b) a function that return hyperlinks for that kind of here. +;; +;; Idea: rename them, and use names like: +;; ee-here-info-p +;; ee-here-info-links + + + +;; Some tools for detecting which kind of buffer we're in. +(defun ee-buffer-re (re) + (if (string-match re (buffer-name)) + (match-string 1 (buffer-name)))) +(defun ee-buffer-eq (str) (string= str (buffer-name))) + +(defun ee-buffer-help0 () (ee-buffer-eq "*Help*")) +(defun ee-buffer-help-re0 (re n) + (if (ee-buffer-help0) + (save-excursion + (goto-char (point-min)) + (if (looking-at re) (match-string n))))) + +(defun ee-buffer-help (re n) (intern (or (ee-buffer-help-re0 re n) "nil"))) + + + +;; By major mode +(defun ee-grep-bufferp () (eq major-mode 'grep-mode)) +(defun ee-man-bufferp () (eq major-mode 'Man-mode)) +(defun ee-rcirc-bufferp () (eq major-mode 'rcirc-mode)) +(defun ee-info-bufferp () (eq major-mode 'Info-mode)) +(defun ee-dired-bufferp () (eq major-mode 'dired-mode)) +(defun ee-wdired-bufferp () (eq major-mode 'wdired-mode)) +(defun ee-w3m-bufferp () (eq major-mode 'w3m-mode)) +(defun ee-custom-bufferp () (eq major-mode 'Custom-mode)) +(defun ee-epackages-bufferp () (eq major-mode 'package-menu-mode)) + +;; By buffer name +(defun ee-intro-bufferp () (ee-buffer-re "^\\*(find-\\(.*\\)-intro)\\*$")) +(defun ee-freenode-bufferp () (ee-buffer-re "^\\(.*\\).freenode\\.net")) +(defun ee-ecolors-bufferp () (ee-buffer-eq "*Colors*")) +(defun ee-efaces-bufferp () (ee-buffer-eq "*Faces*")) +(defun ee-pdftext-bufferp () (ee-buffer-re "^pdftotext")) + +;; By buffer name (when it is "*Help*") +(defvar ee-efunctiondescr-re + "^\\([^ \t\n]+\\) is a[^\t\n]*\\(function\\|Lisp macro\\|special form\\)") +(defun ee-efunctiondescr-bufferp () (ee-buffer-help ee-efunctiondescr-re 1)) +(defun ee-find-efunctiondescr-links () + (let ((f (ee-efunctiondescr-bufferp))) + `((find-efunction-links ',f) + (find-efunctiondescr ',f)))) + +(defvar ee-evardescr-re "^\\([^ \t\n]+\\) is a variable") +(defun ee-evardescr-bufferp () (ee-buffer-help ee-evardescr-re 1)) +(defun ee-find-evardescr-links () + (let ((v (ee-evardescr-bufferp))) + `((find-evariable-links ',v) + (find-evardescr ',v)))) + +(defvar ee-efacedescr-re "^Face: \\([^ \t\n]+\\)") +(defun ee-efacedescr-bufferp () (ee-buffer-help ee-efacedescr-re 1)) +(defun ee-find-efacedescr-links () + (let ((f (ee-efacedescr-bufferp))) + `((find-eface-links ',f) + (find-efacedescr ',f)))) + +(defvar ee-epackage-re "^\\([^ \t\n]+\\) is a[ -~]+ package") +(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)))) + +;; By buffer name (when the mode is man) +(defvar ee-man-re "^\\*Man \\(.*\\)\\*$") +(defun ee-find-man-links () + (let ((mp (ee-buffer-re ee-man-re))) + `((find-man ,mp)))) + +(defvar ee-custom-re "^\\*Customize Group: \\(.*\\)\\*$") +(defun ee-find-custom-links () + (let* ((name (ee-buffer-re ee-custom-re)) + (symbol (intern (downcase (replace-regexp-in-string " " "-" name))))) + `((find-customizegroup ',symbol)))) + +;; Other cases +(defun ee-file-bufferp () buffer-file-name) + + +(defun ee-find-efaces-links () `((find-efaces))) +(defun ee-find-ecolors-links () `((find-ecolors))) +(defun ee-find-epackages-links () `((find-epackages))) +(defun ee-find-pdftext-links () (ee-pdflike-page-links)) + + + +;; to to: +;; ee-find-w3m-links +;; ee-find-ecolor-links +;; + +(defun ee-find-here-links () + (cond ;; by major mode + ((ee-info-bufferp) (cons "" (ee-find-info-links))) ; M-h M-i + ((ee-man-bufferp) (cons "" (ee-find-man-links))) ; ? + ((ee-grep-bufferp) (cons "" (ee-find-grep-links))) ; M-h M-g + ((ee-w3m-bufferp) (cons "" (ee-find-w3m-links))) ; M-h M-w + ((ee-dired-bufferp) (cons "" (ee-find-file-links))) ; M-h f + ((ee-wdired-bufferp) (cons "" (ee-find-file-links))) ; M-h f + ((ee-custom-bufferp) (cons "" (ee-find-custom-links))) ; ? + ((ee-epackages-bufferp) (cons "" (ee-find-epackages-links))) ; ? + ;; by buffer name + ((ee-intro-bufferp) (cons "" (ee-find-intro-links))) ; M-h M-i + ((ee-freenode-bufferp) (cons "" (ee-find-freenode-links))) ; ? + ((ee-ecolors-bufferp) (cons "" (ee-find-ecolors-links))) ; ? + ((ee-efaces-bufferp) (cons "" (ee-find-efaces-links))) ; ? + ((ee-pdftext-bufferp) (cons "" (ee-find-pdftext-links))) ; ? + ;; by buffer name, when it is "*Help*" + ((ee-efunctiondescr-bufferp) (cons "" (ee-find-efunctiondescr-links))) + ((ee-efacedescr-bufferp) (cons "" (ee-find-efacedescr-links))) + ((ee-evardescr-bufferp) (cons "" (ee-find-evardescr-links))) + ((ee-epackage-bufferp) (cons "" (ee-find-epackage-links))) + ;; other cases + ((ee-file-bufferp) (cons "" (ee-find-file-links))) ; M-h f + (t (list "" "Not implemented!" "See:" + '(find-efunction 'ee-find-here-links))) + )) + +(defun find-here-links-test (sexp) +"See: (find-links-intro \"`find-here-links'\")" + (find-wset "13o_2o_o" sexp '(find-here-links))) + +;; (find-man "1 cat") +;; (progn (find-man "1 cat") (buffer-name)) +;; (find-eevfile "eev-rcirc.el") + +(defun ee-find-here-links0 () + `(,(ee-H "See: ") + (find-eev-quick-intro "4.1. `find-here-links'") + (find-emacs-keys-intro "1. Basic keys (eev)" "M-h M-h") + (find-here-links-intro "4. `find-here-links-3'") + )) + + + +;;; __ _ _ _ _ _ _ +;;; / _(_)_ __ __| | | |__ ___ _ __ ___ | (_)_ __ | | _____ +;;; | |_| | '_ \ / _` |_____| '_ \ / _ \ '__/ _ \_____| | | '_ \| |/ / __| +;;; | _| | | | | (_| |_____| | | | __/ | | __/_____| | | | | | <\__ \ +;;; |_| |_|_| |_|\__,_| |_| |_|\___|_| \___| |_|_|_| |_|_|\_\___/ +;;; + +;; (find-find-links-links "\\M-h" "here" "") +;; +(defun find-here-links (&rest pos-spec-list) +"Visit a temporary buffer containing hyperlinks pointing to here." + (interactive) + (apply 'find-elinks + `(;; The first line of a find-here-links buffer DOES NOT + ;; regenerates the buffer - instead the first lines point to + ;; help pages. + ,@(ee-find-here-links0) + ,@(ee-find-here-links) + ) + pos-spec-list)) + +;; Test: (find-here-links) +;; (progn (find-enode "Screen") (find-here-links)) + + + +;;; _ _ +;;; | |__ ___ __ _(_)_ __ _ __ ___ _ __ +;;; | '_ \ / _ \/ _` | | '_ \| '_ \ / _ \ '__| +;;; | |_) | __/ (_| | | | | | | | | __/ | +;;; |_.__/ \___|\__, |_|_| |_|_| |_|\___|_| +;;; |___/ +;; +;; «find-here-links-beginner» (to ".find-here-links-beginner") +;; This is a hack for beginners that is explained in a tutorial. See: +;; (find-refining-intro "4. A tip for beginners") +;; (find-refining-intro "4. A tip for beginners" "find-here-links-beginner") +;; +(defun find-here-links-beginner (&optional arg) + "A variant of `find-here-links' that may create a three-window setting." + (interactive "P") + (if arg (find-here-links-3) (find-here-links))) + +;; «find-here-links-3» (to ".find-here-links-3") +;; See: (find-here-links-intro "4. `find-here-links-3'") +;; (find-here-links-intro "5. `find-here-links-1'") +;; +(defvar ee-window-configuration-before-M-h-M-3 nil) + +(defun find-here-links-3 () + "A variant of `find-here-links' that creates a three-window setting. +Before creating the three windows this function tries to save the +current window configuration to the variable +`ee-window-configuration-before-M-h-M-3', but if that variable is +not nil we abort instead of overwriting it. +See: (find-here-links-intro \"4. `find-here-links-3'\")" + (interactive) + (if ee-window-configuration-before-M-h-M-3 + (let ((overwrite + (yes-or-no-p "Overwrite `ee-window-configuration-before-M-h-M-3'? "))) + (if (not overwrite) + (error)))) + (setq ee-window-configuration-before-M-h-M-3 + (current-window-configuration)) + (find-wset "13_o2_o_coo" nil '(find-here-links) '(eejump-1))) + +(defun find-here-links-1 () + "Restore the window configuration before `find-here-links-3'. +See: (find-here-links-intro \"5. `find-here-links-1'\")" + (interactive) + (set-window-configuration ee-window-configuration-before-M-h-M-3) + (setq ee-window-configuration-before-M-h-M-3 nil)) + + + + + + + + +(provide 'eev-hlinks) + + + +;; Local Variables: +;; coding: utf-8-unix +;; no-byte-compile: t +;; End: diff --git a/eev-intro.el b/eev-intro.el index 94678f7..94c65df 100644 --- a/eev-intro.el +++ b/eev-intro.el @@ -3966,7 +3966,12 @@ We start from some observations: `find-code-pdf-page' as its associated debugging function, and so on. - f) If we call the hyperlinks in the items above \"non-basic\" + f) `find-here-links' and its variants create temporary buffers + that violate this convention: + + (find-links-intro \"5. The first line regenerates the buffer\") + + g) If we call the hyperlinks in the items above \"non-basic\" then we get - by exclusion! - a notion of what are \"basic hyperlinks\". @@ -3977,6 +3982,7 @@ and a hyperlink to the source file at the right: External processes: (find-eev \"eev-plinks.el\") `find-elinks': (find-eev \"eev-elinks.el\") `find-elinks'+`ee-template0': (find-eev \"eev-tlinks.el\") + `find-here-links': (find-eev \"eev-hlinks.el\") `code-c-d' and `find-code-c-d': (find-eev \"eev-code.el\") `code-pdf*' and `find-code-pdf*': (find-eev \"eev-pdflike.el\") @@ -8543,8 +8549,28 @@ LIST that are sexps are converted to strings using `ee-HS'. See: +4. Skels +======== +Many functions in eev have comments that start with \";; Skel:\", +like this: + + ;; Skel: (find-find-links-links-new \"fossil\" \"url subdir c\" \"\") + +A comment like that before a function means that I wrote that +function by first running that sexp and then modifying the code +that that sexp generated, that was a \"skeleton\". + +Try: + + (find-find-links-links-new \"fossil\" \"url subdir c\" \"\") + (find-eev \"eev-tlinks.el\" \"find-fossil-links\") + (find-eevgrep \"grep --color -nH --null -e Skel: *.el\") + + + + -4. `find-find-links-links' +5. `find-find-links-links' ========================== ALL my `find-*-links' started as quick hacks. SOME of them were useful enough to deserve being cleaned up. diff --git a/eev-load.el b/eev-load.el index b6ddd2d..547629e 100644 --- a/eev-load.el +++ b/eev-load.el @@ -1,7 +1,7 @@ ;;; eev-load.el -- load all the main modules of eev. ;;; This can also be used as an index to the main source files. -;; Copyright (C) 2019 Free Software Foundation, Inc. +;; Copyright (C) 2019-2020 Free Software Foundation, Inc. ;; ;; This file is part of GNU eev. ;; @@ -104,6 +104,7 @@ (require 'eev-plinks) ; (find-eev "eev-plinks.el") (require 'eev-elinks) ; (find-eev "eev-elinks.el") (require 'eev-tlinks) ; (find-eev "eev-tlinks.el") +(require 'eev-hlinks) ; (find-eev "eev-hlinks.el") ;; ;; The `brxxx' functions. See: ;; (find-eev-quick-intro "3.1. Non-elisp hyperlinks")