[In a fit of insanity and high self-esteem (99oct16) I wrote this and sent it to Richard Stallman, supposing that he would be able to fill out all missing details by himself. Some weeks later he sent a reply with lots of questions on unclear points and suggesting me to start documenting my eev thing a real lot -- which is what I am now trying to do. I admit that the technical parts of this message can be very obscure, so please read this as just something with historical/sentimental value; the nicest part comes after the "The consequences of this are:". For clearer stuff see my emacs page at http://angg.twu.net/emacs.html. Edrx, 99dec12.] Hi Richard, Excuse for bothering you directly, but I found that I was spending too much time in finding the "perfect mailing list" and "writing the perfect announce" for a package that I wrote and that I've been using heavily over the last five years. Well, let me skip the boring histories and describe the package shortly, first by quoting bits from its documentation. ;;; eev.el -- embed shell/tcl/perl code and elisp hyperlinks in plain text. ; "C-x eev" writes the "region" of the current buffer (i.e., ; everything between the cursor and the "mark") to a file, so that it ; can be executed as a script. In fact it does better than that: the ; region is saved surrounded by "set -v" and "set +v" and we source it ; instead of running it as a script, to let it use and change the ; environment, the directory and the pool of aliases and functions of ; the current shell. Marking a block of text in emacs, typing "C-x ; evv" and then going to a shell and running "ee" (which should be ; aliased to `. $EE', where EE is usually set to ~/bin/emacs.ee, is ; almost 100% equivalent to typing each line to the shell. ;;;;; code-c-d, a factory of hypertext functions ; (...) for example, (code-c-d "awk" "/usr/src/gawk-3.0.3/" "gawk") runs ; ; (progn ; (setq awkdir "/usr/src/gawk-3.0.3/") ; (setq awktagsfile "/usr/src/gawk-3.0.3/TAGS") ; (defun awkfile (str) (concat awkdir str)) ; (defun set-awk-tags () (setq tags-file-name awktagsfile)) ; (defun find-awkfile (str &optional line) (set-awk-tags) ; (find-fline (awkfile str) line)) ; (defun find-awktag (str) (set-awk-tags) (find-tag str)) ; (defun find-awkw3 (furl) (w3-open-local (concat awkdir furl)))) ; ; (progn ; (defun find-awknode (nodename &optional line) ; (find-node2 "gawk" nodename line))) So that inside any text file that we're writing (e.g., a source file or a file where we keep our notes) we can place comments that are in fact S-expressions, like # (find-k2file "drivers/char/console.c") # (find-k2tag "setterm_command") # (find-zshnode "Shell Builtin Commands" "getopt") # (code-c-d "ct" "/usr/src/console-tools-1998.08.11/") # (find-ctfile "") # (find-ctfile "screenfonttools/showcfont.c") # (find-ctfile "screenfonttools/consolechars.c") # (find-ctfile "NEWS") # (find-fline "/usr/include/linux/kd.h" "PIO_FONTX") # (find-k2file "drivers/char/vt.c" "PIO_FONTX") and by placing the cursor after one of them and running eval-last-sexp (C-x C-e) we make emacs visit a certain file or a certain info node, maybe also going to a certain position; this seems to be the cheapest possible -- and certainly the most transparent -- way to do hyperlinks. And by using the eev command we can make parts of our notes files act as chunks of shell commands, and by using variations on eev other parts can act as little Tcl or expect scripts, blocks of TeX code, whatever. The consequences of this are: 1) We don't need to memorize those little sequences of commands that we used once, and that worked. If we have typed them first on a file of notes (or pasted them there) and then eev-ed them, they'll just stay in the notes; if they're good enough someday we'll make them prettier and put some comments around. No need to turn them into a script with a header and a name; no need to make them into a "product". We also don't need to go the other way round and write a how-to saying "press this and that". The boundary between text and code becomes blurred, and that is good. 2) It becomes easier to share tricks with other people: one person can give his entire (?) bag of tricks to other, who uses immediately some chunks, gets intrigued by others, follows some links, executes some shell code one line at a time, learns a lot, etc, etc... 3) Undisciplined hackers with a weak memory and not a lot of time (like me, of course!) can contribute to making everybody's computing life better. And it's not only by saying "oh, I know how to do this..." (without explaining enough) or by selling books. 4) People stop to regard Emacs as just an editor. 5) Life becomes pathetic without source code or without emacs. Novices can be taught to (among other things) recompile and single-step in very little time. Oops - sorry, I wrote too much (I always do). To finish quickly: links: - eev.el. GPL'ed. - an index to many files written using those functions. These files are messy -- there's about 800kB there -- but they have html versions with "real" links, and other pages point to them. And they look fantastic with lynx. - my main page. Any comments, flames, etc., welcome. I'll be sending announces to gnu.org, to emacs groups, to freshmeat, etc., as the pages become cleaner. In the meantime, do anything you want with the stuff and the links and please give them to anyone you think it is appropriate. I still don't know well how to proceed... And about the copyright, I'd be happy -- in fact, *extremely* proud -- to assign it to the FSF, but I guess that it should only be done with FSF's consent. Excuse me for taking your time, but I though that you would like to see Emacs being used in such a way. And if you find this way obvious: I also thought this, and I was revolted when I started to discover that this had never occured to the people around me. Now I'm working to make it as obvious as it should be. [], have fun, and thanks for all the tools, inspiration, energy, coherence, etc., Eduardo Ochs edrx@mat.puc-rio.br http://www.mat.puc-rio.br/