branch: externals/eev commit 84a0b6e6bb247efcb519c1e32de172aa55e184c7 Author: Eduardo Ochs <eduardoo...@gmail.com> Commit: Eduardo Ochs <eduardoo...@gmail.com>
New file: eev-wconfig.el. --- ChangeLog | 10 ++ VERSION | 4 +- eepitch.el | 3 +- eev-intro.el | 12 +- eev-on-windows.el | 29 +++- eev-pdflike.el | 9 +- eev-tlinks.el | 1 + eev-wconfig.el | 494 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ eev.el | 2 +- 9 files changed, 548 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index e0c7ae2261..526ef6b598 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2022-04-16 Eduardo Ochs <eduardoo...@gmail.com> + + * eev-wconfig.el: new file. + +2022-04-15 Eduardo Ochs <eduardoo...@gmail.com> + + * eev-pdflike.el (find-pdftotext-page): define it explicitly. + + * eepitch.el (eepitch-eshell3): new function. + 2022-04-13 Eduardo Ochs <eduardoo...@gmail.com> * eev-tlinks.el (ee-find-psne-echo-options): new function. diff --git a/VERSION b/VERSION index 64cba9fa6d..15bdb63af5 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Thu Apr 14 03:00:14 GMT 2022 -Thu Apr 14 00:00:14 -03 2022 +Sat Apr 16 08:39:20 GMT 2022 +Sat Apr 16 05:39:20 -03 2022 diff --git a/eepitch.el b/eepitch.el index 2dd62a4097..b5b977f5b1 100644 --- a/eepitch.el +++ b/eepitch.el @@ -19,7 +19,7 @@ ;; ;; Author: Eduardo Ochs <eduardoo...@gmail.com> ;; Maintainer: Eduardo Ochs <eduardoo...@gmail.com> -;; Version: 20220115 +;; Version: 20220416 ;; Keywords: e-scripts ;; ;; Latest version: <http://angg.twu.net/eev-current/eepitch.el> @@ -493,6 +493,7 @@ scratch." (defun eepitch-shell3 () (interactive) (eepitch '(shell "*shell 3*"))) (defun eepitch-eshell () (interactive) (eepitch '(eshell))) (defun eepitch-eshell2 () (interactive) (eepitch '(eshell 2))) +(defun eepitch-eshell3 () (interactive) (eepitch '(eshell 3))) diff --git a/eev-intro.el b/eev-intro.el index afee1620df..5cc004fda9 100644 --- a/eev-intro.el +++ b/eev-intro.el @@ -13949,12 +13949,12 @@ explained in the source of eshell: `find-psne-links' accepts two optional arguments after the URL. The first of them is called `wget-options', and when it is not -given it defaults to \"-nc\" (\"no-clobber\"). The optional -argument is called `echo-options', and _ideally_ it should -default to \"\" on \"normal\" unix shells, and to \"-N\" on -eshell. When it is not given eev runs the function -`ee-find-psne-echo-options' to decide what to do, and the -default definition of that function is: +given it defaults to \"-nc\" (\"no-clobber\"). The second +optional argument is called `echo-options', and _ideally_ it +should default to \"\" on \"normal\" unix shells, and to \"-N\" +on eshell. When it is not given eev runs the function +`ee-find-psne-echo-options' to decide what to do, and the default +definition of that function is: ;; See: (find-eev \"eev-tlinks.el\" \"ee-find-psne-echo-options\") ;; diff --git a/eev-on-windows.el b/eev-on-windows.el index 2dd6a4ebf7..ec133f5d68 100644 --- a/eev-on-windows.el +++ b/eev-on-windows.el @@ -19,7 +19,7 @@ ;; ;; Author: Eduardo Ochs <eduardoo...@gmail.com> ;; Maintainer: Eduardo Ochs <eduardoo...@gmail.com> -;; Version: 20211110 +;; Version: 20220416 ;; Keywords: e-scripts ;; ;; Latest version: <http://angg.twu.net/eev-current/eev-on-windows.el> @@ -60,10 +60,29 @@ ;;; Commentary: ;; -;; Experimental, undocumented, and messy. Every time that I give a -;; workshop to Windows users this file changes a lot. Most of what was -;; here in the last revision was rewritten in a more human-readable -;; form and placed in: +;; Long short short: this is obsolete. +;; +;; Long story medium-sized: In 2021 I found some Windows users who +;; were interested in learning Emacs and eev, and I wrote this to try +;; to make configuring eev on Windows easier. See: +;; +;; http://angg.twu.net/2021-2022-workshops.html +;; (find-windows-beginner-intro) +;; +;; In april/2022 I started to work on a different approach for +;; configuring eev on Windows, and I declared that this file had +;; become obsolete. The new approach is here: +;; +;; (find-eev "eev-wconfig.el") +;; http://angg.twu.net/eev-customize.html +;; +;; Long story long: read the rest of this file (warning: old stuff!). + + +;; I wrote this for some Experimental, undocumented, and messy. Every +;; time that I give a workshop to Windows users this file changes a +;; lot. Most of what was here in the last revision was rewritten in a +;; more human-readable form and placed in: ;; ;; (find-windows-beginner-intro) diff --git a/eev-pdflike.el b/eev-pdflike.el index 4b9eda17d2..25fe6f1f80 100644 --- a/eev-pdflike.el +++ b/eev-pdflike.el @@ -628,6 +628,8 @@ newline are spurious - and replaces them by \"(ff)\"." ;; (find-code-pdfbackendalias "pdf-text" "pdftotext-text") (code-pdfbackendalias "pdf-text" "pdftotext-text") +(defalias 'find-pdf-text 'find-pdftotext-text) + @@ -694,6 +696,11 @@ We define it just to make this work: (find-efunction 'find-xpdf-page)" (defun ee-find-pdftotext-text (fname &rest rest) `(,ee-pdftotext-program "-layout" "-enc" "Latin1" ,(ee-expand fname) "-")) +(defun find-pdftotext-page (fname &optional page &rest rest) + "This defun will be overridden by the `code-pdftextbackend' below. +We define it just to make this work: (find-efunction 'find-pdftotext-page)" + (apply 'find-sh-page (ee-find-pdftotext-text fname) page rest)) + ;; (find-man "1 pdftotext") ;; (find-man "1 pdftotext" "-enc encoding-name") ;; @@ -716,7 +723,7 @@ We define it just to make this work: (find-efunction 'find-xpdf-page)" ;;; |_|\___/_/\_\ \_/\_/ \___/|_| |_|\_\___/ ;;; ;; «find-texworkspdf-page» (to ".find-texworkspdf-page") -;; At this moment TeXworks is my default PDF viewer on W$s. See: +;; At one point TeXworks was my default PDF viewer on W$s. See: ;; ;; http://www.tug.org/texworks/ ;; https://tug.org/pipermail/tex-live/2019-March/043227.html diff --git a/eev-tlinks.el b/eev-tlinks.el index a182a578aa..546120080d 100644 --- a/eev-tlinks.el +++ b/eev-tlinks.el @@ -3031,6 +3031,7 @@ For more info on this particular video, run: ;; Skel: (find-find-links-links-new "advicebefore" "fun" "") ;; Test: (find-advicebefore-links) ;; (find-advicebefore-links "FOO") +;; Screenshot: http://angg.twu.net/IMAGES/find-advicebefore-links.png ;; ;; I wrote this when I was trying to learn edebug and I was failing ;; miserably. diff --git a/eev-wconfig.el b/eev-wconfig.el new file mode 100644 index 0000000000..f2549636df --- /dev/null +++ b/eev-wconfig.el @@ -0,0 +1,494 @@ +;;; eev-wconfig.el -- configure eev on M$ Windows. -*- lexical-binding: nil; -*- + +;; Copyright (C) 2022 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: 20220416 +;; Keywords: e-scripts +;; +;; Latest version: <http://angg.twu.net/eev-current/eev-wconfig.el> +;; htmlized: <http://angg.twu.net/eev-current/eev-wconfig.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-psne-intro.html> +;; <http://angg.twu.net/eev-intros/find-prepared-intro.html> +;; (find-eev-intro) +;; (find-psne-intro) +;; (find-prepared-intro) + +;;; Comment: + +;; This file is not loaded by default. To use it, run: +;; +;; (require 'eev-wconfig) +;; (find-wconfig-links) +;; +;; Or: +;; +;; (load (buffer-file-name)) +;; (find-wconfig-links) +;; (find-wconfig-wget-links) +;; (find-wconfig-shell-links) +;; (find-wconfig-pdf-links) +;; (find-wconfig-lua-links) +;; (find-wconfig-mpv-links) +;; +;; This is another attempt - based on ideas that I had in april/2022 - +;; to make eev easy to configure on M$ Windows. This attempt is mostly +;; targeted to "non-users", and it follows many of the principles that +;; I explained in these two videos, +;; +;; Title: Org for Non-Users (2021) +;; Page: http://angg.twu.net/2021-org-for-non-users.html +;; Play: (find-2021orgfornonusersvideo "0:00") +;; Info: (find-1stclassvideo-links "2021orgfornonusers") +;; Index: (find-1stclassvideoindex "2021orgfornonusers") +;; +;; Title: Why eev has a weird elisp tutorial and how to use it +;; Page: http://angg.twu.net/find-elisp-intro.html +;; Play: (find-2022findelispintrovideo "0:00") +;; Info: (find-1stclassvideo-links "2022findelispintro") +;; Index: (find-1stclassvideoindex "2022findelispintro") +;; +;; and in this page: +;; +;; http://angg.twu.net/eev-customize.html +;; +;; More precisely, this is targeted to people who like to "open the +;; lid" to see how things look inside, and who don't mind if at first +;; they understand only a bit of what they see; and who are still +;; using mostly M$ Windows, but who are trying to use GNU/Linux more. +;; I believe that these people will find this approach much more +;; interesting and fun than my previous attempts. +;; +;; At this moment (2022apr16) I am testing this with a friend with +;; whom I interact mostly via Telegram and IRC. The docs are very +;; incomplete! + + +;; Index: +;; «.find-wconfig-links» (to "find-wconfig-links") +;; «.find-wconfig-wget-links» (to "find-wconfig-wget-links") +;; «.find-wconfig-shell-links» (to "find-wconfig-shell-links") +;; «.find-wconfig-pdf-links» (to "find-wconfig-pdf-links") +;; «.find-wconfig-lua-links» (to "find-wconfig-lua-links") +;; «.find-wconfig-mpv-links» (to "find-wconfig-mpv-links") + + + + +;; «find-wconfig-links» (to ".find-wconfig-links") +;; Skel: (find-find-links-links-new "wconfig" "" "") +;; Test: (find-wconfig-links) +;; +(defun find-wconfig-links (&rest pos-spec-list) +"Visit a temporary buffer containing hyperlinks for wconfig." + (interactive) + (apply + 'find-elinks-elisp + `((find-wconfig-links ,@pos-spec-list) + ;; Convention: the first sexp always regenerates the buffer. + (find-efunction 'find-wconfig-links) + "" + ,(ee-template0 "\ +(find-wconfig-wget-links) +(find-wconfig-shell-links) +(find-wconfig-pdf-links) +(find-wconfig-lua-links) +(find-wconfig-mpv-links) +") + ) + pos-spec-list)) + + + +;;; __ __ _ +;;; \ \ / /_ _ ___| |_ +;;; \ \ /\ / / _` |/ _ \ __| +;;; \ V V / (_| | __/ |_ +;;; \_/\_/ \__, |\___|\__| +;;; |___/ +;; +;; «find-wconfig-wget-links» (to ".find-wconfig-wget-links") +;; Skel: (find-find-links-links-new "wconfig-wget" "" "") +;; Test: (find-wconfig-wget-links) +;; (defun edt () (interactive) (eval-defun nil) (find-wconfig-wget-links)) +;; +(defun find-wconfig-wget-links (&rest pos-spec-list) +"Visit a temporary buffer containing a script for configuring wget on Windows." + (interactive) + (apply + 'find-elinks-elisp + `((find-wconfig-wget-links ,@pos-spec-list) + ;; Convention: the first sexp always regenerates the buffer. + (find-efunction 'find-wconfig-wget-links) + "" + ,(ee-template0 "\ + +;; 1. Download wget.exe +;; ==================== +;; Run the sexps below to download a wget for Windows and put it +;; in ~/bin/wget.exe. For more info on that wget.exe, see: +;; http://angg.twu.net/2021-oficina/ +;; http://angg.twu.net/2021-oficina/README +;; +(require 'eww) +(defun ee-download-with-eww (url dir) + (url-retrieve url #'eww-download-callback (list url dir))) +;; +(mkdir \"~/bin/\" t) +(delete-file \"~/bin/wget.exe\") +(ee-download-with-eww \"http://angg.twu.net/2021-oficina/wget.exe\" \"~/bin/\") +;; +;; Tests: +;; (find-fline \"~/bin/\") +;; (find-fline \"~/bin/\" \"wget.exe\") +;; (find-callprocess \"~/bin/wget.exe --help\") +;; and: + + (eepitch-eshell) + (eepitch-kill) + (eepitch-eshell) +rm --help +ls --help + +ls ~/bin/ +~/bin/wget.exe --version +~/bin/wget.exe --help +cd ~/bin/ +rm -fv README +~/bin/wget.exe http://angg.twu.net/2021-oficina/README +ls -lF README +ls -lF ~/bin/README + + + +;; 2. Configure `find-wget' +;; ======================== +;; Run this: +;; +(setq ee-wget-program \"~/bin/wget.exe\") +;; +;; To test it, run the tests in the sections \"Tests:\" here: +;; (find-eev \"eev-plinks.el\" \"find-wget\") +;; (find-eev \"eev-plinks.el\" \"find-wget\" \"Tests:\") +;; The concept of \"anchor\" is explained here: +;; (find-eev-quick-intro \"8. Anchors\") + + + +;; 3. Save the settings in your ~/.emacs +;; ===================================== +;; If all the tests above worked, put the two lines below +;; in your ~/.emacs: + +;; See: (find-wconfig-wget-links) +(setq ee-wget-program \"~/bin/wget.exe\") + + + +;; Random notes +;; ============ +;; The two sexps below undoes the configurations above: +;; (setq ee-wget-program \"wget\") + +") + ) + pos-spec-list)) + + + + + +;;; ____ _ _ _ +;;; / ___|| |__ ___| | | +;;; \___ \| '_ \ / _ \ | | +;;; ___) | | | | __/ | | +;;; |____/|_| |_|\___|_|_| +;;; +;; «find-wconfig-shell-links» (to ".find-wconfig-shell-links") +;; Skel: (find-find-links-links-new "wconfig-shell" "" "") +;; Test: (find-wconfig-shell-links) +;; (defun edt () (interactive) (eval-defun nil) (find-wconfig-shell-links)) +;; +(defun find-wconfig-shell-links (&rest pos-spec-list) +"Visit a temporary buffer containing a script for configuring eshell on Windows." + (interactive) + (apply + 'find-elinks-elisp + `((find-wconfig-shell-links ,@pos-spec-list) + ;; Convention: the first sexp always regenerates the buffer. + (find-efunction 'find-wconfig-shell-links) + "" + ,(ee-template0 "\ +;; Note: only run this after configuring wget! +;; See: (find-wconfig-wget-links) + +;; (find-windows-beginner-intro \"5.5. Shell Mode\") +;; (find-eev-quick-intro \"6. Controlling shell-like programs\") +;; (find-eepitch-intro \"1.2. Two targets\") +;; (find-node \"(eshell)Top\") +;; (find-node \"(eshell)Command Index\") + + + +;; 1. Make Eshell use wget.exe +;; =========================== +;; Run this to configure Eshell to use ~/bin/wget.exe: +;; +;; (require 'eshell) +;; (require 'em-alias) +;; (eshell/alias \"wget\" \"~/bin/wget.exe $*\") +;; +;; The block above only need to be run once. +;; For the technical details, see: +;; +;; (find-node \"(eshell)Aliases\" \"eshell-aliases-file\") +;; (find-evardescr 'eshell-directory-name) +;; (find-evariable 'eshell-directory-name) +;; (find-evardescr 'eshell-aliases-file) +;; (find-evariable 'eshell-aliases-file) +;; eshell-directory-name +;; eshell-aliases-file +;; (find-fline eshell-directory-name) +;; (find-fline eshell-aliases-file) +;; +;; Test with: + + (eepitch-eshell) + (eepitch-kill) + (eepitch-eshell) +which wget +~/bin/wget.exe --version +wget --version + + + +;; 2. Make `eepitch-shell' use Eshell +;; ================================== +;; See: (find-windows-beginner-intro \"5.5. Shell Mode\") +;; (find-eev \"eepitch.el\" \"eepitch-shell\") +;; +;; Run these sexps: +;; +(defun eepitch-shell () (interactive) (eepitch-eshell)) +(defun eepitch-shell2 () (interactive) (eepitch-eshell2)) +(defun eepitch-shell3 () (interactive) (eepitch-eshell3)) + + + + (eepitch-eshell) + (eepitch-kill) + (eepitch-eshell) +which wget + + (eepitch-shell) + (eepitch-kill) + (eepitch-shell) +which wget + + +;; 3. Save this config in your ~/.emacs +;; ==================================== +;; If the two eepitch blocks above behaved in the same way, +;; then put this block of four lines in your ~/.emacs: + +;; See: (find-wconfig-shell-links) +(defun eepitch-shell () (interactive) (eepitch-eshell)) +(defun eepitch-shell2 () (interactive) (eepitch-eshell2)) +(defun eepitch-shell3 () (interactive) (eepitch-eshell3)) + + + +;; 4. Note for *nix users testing this +;; =================================== +;; The configuration above can be reverted with: +;; +(defun eepitch-shell () (interactive) (eepitch '(shell))) +(defun eepitch-shell2 () (interactive) (eepitch '(shell \"*shell 2*\"))) +(defun eepitch-shell2 () (interactive) (eepitch '(shell \"*shell 3*\"))) + +") + ) + pos-spec-list)) + + + +;;; ____ _ __ +;;; | _ \ __| |/ _| +;;; | |_) / _` | |_ +;;; | __/ (_| | _| +;;; |_| \__,_|_| +;;; +;; «find-wconfig-pdf-links» (to ".find-wconfig-pdf-links") +;; Skel: (find-find-links-links-new "wconfig-pdf" "" "") +;; Test: (find-wconfig-pdf-links) +;; (defun edt () (interactive) (eval-defun nil) (find-wconfig-pdf-links)) +;; +(defun find-wconfig-pdf-links (&rest pos-spec-list) +"Visit a temporary buffer containing hyperlinks for wconfig-pdf." + (interactive) + (apply + 'find-elinks-elisp + `((find-wconfig-pdf-links ,@pos-spec-list) + ;; Convention: the first sexp always regenerates the buffer. + (find-efunction 'find-wconfig-pdf-links) + "" + ,(ee-template0 "\ +;; Note: only run this after configuring +;; the pdf viewer, wget, and Eshell! See: +;; (find-newbrowser-links nil nil nil \"3. Configure `find-pdf-page'\") +;; (find-wconfig-wget-links) +;; (find-wconfig-shell-links) + + + +;; 1. Download pdftotext and a PDF file +;; ==================================== +;; Run: + + (eepitch-eshell) + (eepitch-kill) + (eepitch-eshell) +cd ~/bin/ +rm -fv ~/bin/pdftotext.exe +wget http://angg.twu.net/2021-oficina/pdftotext.exe +rm -fv ~/Coetzee99.pdf +cd +wget https://tannerlectures.utah.edu/_resources/documents/a-to-z/c/Coetzee99.pdf + +# Tests: +~/bin/pdftotext.exe --help +# +# (find-callprocess \"~/bin/pdftotext.exe --help\") + + + +;; 2. Configure pdftotext +;; ====================== +;; Run this: +(setq ee-pdftotext-program \"~/bin/pdftotext.exe\") +;; +;; And then run these tests: +(find-pdf-page \"~/Coetzee99.pdf\") +(find-pdf-page \"~/Coetzee99.pdf\" 3) +(find-pdf-text \"~/Coetzee99.pdf\") +(find-pdf-text \"~/Coetzee99.pdf\" 3) + + +") + ) + pos-spec-list)) + + + + + +;;; _ +;;; | | _ _ __ _ +;;; | | | | | |/ _` | +;;; | |__| |_| | (_| | +;;; |_____\__,_|\__,_| +;;; +;; «find-wconfig-lua-links» (to ".find-wconfig-lua-links") +;; Skel: (find-find-links-links-new "wconfig-lua" "" "") +;; Test: (find-wconfig-lua-links) +;; (defun edt () (interactive) (eval-defun nil) (find-wconfig-lua-links)) +;; +(defun find-wconfig-lua-links (&rest pos-spec-list) +"Visit a temporary buffer containing hyperlinks for wconfig-lua." + (interactive) + (apply + 'find-elinks-elisp + `((find-wconfig-lua-links ,@pos-spec-list) + ;; Convention: the first sexp always regenerates the buffer. + (find-efunction 'find-wconfig-lua-links) + "" + ,(ee-template0 "\ + + (eepitch-eshell) + (eepitch-kill) + (eepitch-eshell) +rm -fv ~/bin/lua52.exe +wget http://angg.twu.net/2021-oficina/lua52.exe +rm -fv ~/bin/lua52.dll +wget http://angg.twu.net/2021-oficina/lua52.dll + + (eepitch-eshell) + (eepitch-kill) + (eepitch-eshell) +~/bin/lua5.2 -v +~/bin/lua5.2 -i + print(2+3) + os.exit() + + +;; See: (find-eev-quick-intro \"6.2. Other targets\") + +;; Redefine `eepitch-lua51' and `eepitch-lua52' to make +;; them (both) use ~/bin/lua52.exe. + +(defun eepitch-lua51 () (interactive) + (eepitch-comint \"lua52.exe\" \"~/bin/lua52.exe -i\")) +(defun eepitch-lua52 () (interactive) + (eepitch-comint \"lua52.exe\" \"~/bin/lua52.exe -i\")) + + +") + ) + pos-spec-list)) + + + + +;; «find-wconfig-mpv-links» (to ".find-wconfig-mpv-links") +;; Skel: (find-find-links-links-new "wconfig-mpv" "" "") +;; Test: (find-wconfig-mpv-links) +;; (defun edt () (interactive) (eval-defun nil) (find-wconfig-mpv-links)) +;; +(defun find-wconfig-mpv-links (&rest pos-spec-list) +"Visit a temporary buffer containing hyperlinks for wconfig-mpv." + (interactive) + (apply + 'find-elinks-elisp + `((find-wconfig-mpv-links ,@pos-spec-list) + ;; Convention: the first sexp always regenerates the buffer. + (find-efunction 'find-wconfig-mpv-links) + "" + ,(ee-template0 "\ + +;; (find-video-links-intro \"6. Configuring Mpv\") + +(setenv \"MPVDIR\" \"c:/Users/danie/OneDrive/Documentos/mpv\") +(setq ee-mpv-program \"$MPVDIR/mpv.exe\") + +") + ) + pos-spec-list)) + + + + +(provide 'eev-wconfig) + + +;; Local Variables: +;; coding: utf-8-unix +;; no-byte-compile: t +;; End: diff --git a/eev.el b/eev.el index 780ead7aab..83252aeda1 100644 --- a/eev.el +++ b/eev.el @@ -6,7 +6,7 @@ ;; Package-Requires: ((emacs "24.4")) ;; Keywords: lisp e-scripts ;; URL: http://angg.twu.net/#eev -;; Version: 20220324 +;; Version: 20220416 ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by