1.0 Description

$Id: emacs-elisp.txt,v 2.94 2005/08/14 10:06:25 jaalto Exp $

This document contains Emacs Lisp (elisp) information: links to some papers, Emacs lisp developer sites, notes about emacs debugging, useful package pointers and installation tips. This page does not provide general Emacs help, please refer to Emacs FAQ and Emacs info pages.

In this page you may find both free and unfree products, documentation, binaries and packages that could help learn to take full advantage of Emacs. This page is part of Tiny Tools documentation and you can use package tinytf.el to read text version of this document. The HTML is generated from plain text file with Perl program available at <http://perl-text2html.sourceforge.net/>.

      perl -S t2html.pl                                            \
      --reference #URL-HOME=http://homesite.example.com/           \
      --reference #URL-SITE=http://homesite.example.com/           \
      --author "John Doe"                                          \
      --Out                                                        \
      --print                                                      \
      --print-url                                                  \
      --css-code-bg                                                \
      --css-code-note=Note:                                        \
      --html-frame                                                 \
      emacs-elisp.txt    

1.1 Important Emacs links

Other related URLs


2.0 GNU Emacs

Latest version of gnuclient/gnuserv is available at Martin Schwenke's site <http://meltin.net/hacks/emacs> or possibly <ftp://ftp.wellfleet.com/netman/psmith/emacs>.

Paul Smith comments: ...I suggest you move to gnuserv. It is much better than the one that comes with Emacs. Gnuclient brings up a file in a new frame. Also it includes a "gnudoit" app which executes arbitrary elisp on the Emacs server, allowing things like window manager buttons that invoke Gnus or VM (or RMAIL or whatever), etc.

      (require 'gnuserv)
      ;; here's the part that uses the existing buffer
      (setq server-done-function 'bury-buffer
                 gnuserv-frame (car (frame-list)))
      (setq gnuserv-frame (selected-frame))
      (gnuserv-start)
      (message "gnuserv started.")    

2.1 Emacs Documentation

2.2 Other Lisp related documents and resources

Visit <http://clisp.cons.org> or contact Bruno Haible haible@clisp.cons.org. It has been suggested using CLISP inside XEmacs, for replacing the existing byte code engine.

[Reginald S. Perry <perry AT zso.dec.com>, XEmacs-L 1998-07-02] Clisp is a GPLed implementation of Common Lisp. Its flavor is that it has a CLTL1(Commom Lisp, the Language Vol. 1) feel but they have implemented a large portion of the passed votes in CLTL2 so they are sort of ANSI. There are a couple of cool things about Clisp. First its executable size and memory footprint is surprisingly small for a full-blown lisp implementation....Clisp may be a good portable solution for people who don't have access to Unix to run CMUCL, Linux to run Allegro CL, don't have the cash to get Commom Lisp on Windows or want to use a CL based XEmacs but is running on OS/2 or some other system that commercial lisp vendors wont port their wares to.

Common Lisp Hyper Spec
<http://www.lispworks.com/documentation/HyperSpec/> Harlequin presents the Common Lisp HyperSpec (tm), an HTML document derived (with permission from ANSI and X3) from the ANSI Common Lisp standard (X3.226-1994). In hard copy, the ANSI Common Lisp standard is nearly 1100 printed pages describing nearly a thousand functions and variables in sufficient detail to accommodate hosting of the language on a wide variety of hardware and operating system platforms. While the paper version remains the official standard, we think that as a matter of practice you'll find the Common Lisp HyperSpec much easier to navigate and use than its paper alternative.


3.0 XEmacs - Emacs the next generation

      (setq package-get-remote '(("ftp.xemacs.org" "xemacs/beta/incoming")))    

3.1 Emacs or XEmacs future plans

There has been talk on making let to work like in modern languages, i.e. binding variables locally(lexical scoping), and converting to Common Lisp, possibly replacing Elisp altogether. It's big a task and won't happen soon, but it is on the sketch board. <http://www.xemacs.org/Architecting-XEmacs/index.html>

3.2 XEmacs and Emacs compatibility issues

About Emacs package easy-mmode.el Incompatible re-implementation of XEmacs add-minor-mode, see articles http://www.xemacs.org/list-archives/xemacs-beta/199908/msg00701.html and article http://www.xemacs.org/list-archives/xemacs-beta/199908/msg00706.html and article http://www.xemacs.org/list-archives/xemacs-beta/199908/msg00816.html

4.0 Miscellaneous information

4.1 GNU Emacs history

Why GNU?

Article by Denis Havlik published under mandrakeforum.com Quotes used by permission of Denis. This article no longer exits, due to Mndrake relabelled as Mandriva.

"First part of the speech was "why did I start GNU project" info. Official RMS biography only says: Stallman graduated from Harvard in 1974 with a BA in physics. During his college years, he also worked as a staff hacker at the MIT Artificial Intelligence Lab, learning operating system development by doing it. He wrote the first extensible Emacs text editor there in 1975. In January 1984 he resigned from MIT to start the GNU Project. Without stating the REASON why he left the MIT lab and started GNU project."

"When Richard M. Stallman started his programmers career, world of programming was much different from what it looks like today: back then, ND-agreements and shrink-wrap licenses simply didn't exist, and sharing code was considered normal behavior. Then someone came to idea that he can make a lot of money by NOT sharing the source code, and started the avalanche which ultimately led to Single-click patent and UCITA. The form in which RMS first encountered this brave new world for the first time was somewhat bizarre: Xerox donated a laser printer to the MIT lab he worked in, and this printer was controlled by proprietary software. This printer was great, but it often jammed, and "no source" meant that they had no way of implementing the "printer jammed" warning as they did for other printers, used in the lab. As you can imagine, walking up and down or camping next to printer turned out into a somewhat annoying experience... Worse yet, some time later, Stallman actually met a college which had source code of printer controlling software, and refused to share it because he signed the NDA! Instead of accepting this bizarre situation as "normal", RMS turned around, quit the job at MIT and started the GNU project. (the rest is a history)"

Biography of Guy Steele who designed the original Emacs
Guy is also the author of book "Common Lisp the Language, 2nd Edition". The bio used to be located at http://www.cs.utah.edu/dept/organick/past/GLSbio.htm and the current location unknown, so the text has been copied here.

About Guy L. Steele Jr. Guy L. Steele Jr. is a Distinguished Engineer at Sun Microsystems, Inc. He received his A.B. in applied mathematics from Harvard College (1975), and his S.M. and Ph.D. in computer science and artificial intelligence from M.I.T. (1977 and 1980). He has also been an assistant professor of computer science at Carnegie-Mellon University; a member of technical staff at Tartan Laboratories in Pittsburgh, Pennsylvania; and a senior scientist at Thinking Machines Corporation. He joined Sun Microsystems in 1994.

He is author or co-author of five books: Common Lisp: The Language (Digital Press); C: A Reference Manual (Prentice-Hall); The Hacker's Dictionary (Harper & Row), which has been revised as The New Hacker's Dictionary, edited by Eric Raymond with introduction and illustrations by Guy Steele (MIT Press); The High Performance Fortran Handbook (MIT Press); and The Java Language Specification (Addison-Wesley).

He has published more than two dozen papers on the subject of the Lisp language and Lisp implementation, including a series with Gerald Jay Sussman that defined the Scheme dialect of Lisp. One of these, "Multiprocessing Compactifying Garbage Collection," won first place in the ACM 1975 George E. Forsythe Student Paper Competition. Other papers published in Communications of the ACM are "Design of a LISP-Based Microprocessor" with Gerald Jay Sussman (November 1980) and "Data Parallel Algorithms" with W. Daniel Hillis (December 1986). He has also published papers on other subjects, including compilers, parallel processing, and constraint languages. One song he composed has been published in CACM ("The Telnet Song", April 1984).

The Association for Computing Machinery awarded him the 1988 Grace Murray Hopper Award and named him an ACM Fellow in 1994. He was elected a Fellow of the American Association for Artificial Intelligence in 1990. He led the team that received a 1990 Gordon Bell Prize honorable mention for achieving the fastest speed to that date for a production application: 14.182 Gigaflops. He was also awarded the 1996 ACM SIGPLAN Programming Languages Achievement Award.

He has served on accredited standards committees X3J11 (C language) and X3J3 (Fortran) and is currently chairman of X3J13 (Common Lisp). He was also a member of the IEEE committee that produced the IEEE Standard for the Scheme Programming Language, IEEE Std 1178-1990. He represents Sun Microsystems in the High Performance Fortran Forum, which produced the High Performance Fortran specification in May, 1993.

He has served on Ph.D. thesis committees for eight students. He has served as program chair for the 1984 ACM Lisp Conference and for the 15th ACM POPL conference (1988) and 23rd ACM POPL conference (1996); he also served on program committees for 30 other conferences. He served a five-year term on the ACM Turing Award committee, chairing it in 1990. He served a five-year term on the ACM Grace Murray Hopper Award committee, chairing it in 1992.

He has had chess problems published in Chess Life and Review and is a Life Member of the United States Chess Federation. He has sung in the bass section of the MIT Choral Society (John Oliver, conductor) and the Masterworks Chorale (Allen Lannom, conductor) as well as in choruses with the Pittsburgh Symphony Orchestra at Great Woods (Michael Tilson Thomas, conductor) and with the Boston Concert Opera (David Stockton, conductor). He has played the role of Lun Tha in The King and I and the title role in Li'l Abner.

He designed the original EMACS command set and was the first person to port TeX.

At Sun Microsystems he is responsible for research in language design and implementation strategies, and architectural and software support, and for the specification of the Java programming language.

4.2 Free software pointers

Software Licenses

Documentation licences

Opinions on various licenses and terms

... GFDL'ed documentation with a GPL'ed program means that moving stuff between the documentation and the program is possible only for the copyright holder. This is tedious in the extreme when the program or documentation has multiple copyright holders. Note that there are multiple copyright holders whenever more than one person contributes creative material of more than about 15 lines, unless one of them is employing all the others (work-for-hire), or they signed written, paper copyright assignments. GFDL/GPL dual-licensing would be a good thing for that reason. --Nathanael Nerode 2004-09-22 <http://lists.debian.org/debian-legal/2004/09/msg00451.html>

The GNU FDL is considered by Debian to be a non-free license because of the part that contains "invariant sections" whereby you can make a section non-changeable. See "Draft Debian Position Statement about the GNU Free Documentation License(GFDL)" by Manoj Srivastava <http://people.debian.org/~srivasta/Position_Statement.html>

4.3 Emacs Jokes

4.3.1 The Word Emacs

In the early days, when memory was tight and machines slow people got upset how much memory Emacs used. And it still uses all the memory it can get if you use GNUS with unlimited cache setting. You heard this a lot back then. And no wonder Emacs uses so many key combinations, because Emacs is actually.... [this is from Gnus manual...] What the word in reality means, is explained in the Emacs FAQ. See also the Emacs distribution and file etc/JOKES.

      Q: What does the word "EMACS mean again?"
      A: "Eight Megabytes And Constantly Swapping"
      (E)macs (M)akes (a) (C)omputer (S)low
      (E)scape-(M)eta-(A)lt-(C)ontrol-(S)hift    

Insider joke:

      What? You only have ctrl, alt and meta? Don't you know that
      hyper and super add so much to the Emacs experience? Man, go
      and get a real Emacs keyboard!    

4.3.2 New commands in Emacs

2000-12-03 gnu.emacs.help thread under subject "Re: Gnu Emacs 21?", participating writers Eli Zaretskii, Andre Spiegel, Stefan Monnier, Kai Großjohann and the answering guy: Per Abrahamsen

I need to graduate sometime

With sufficient Emacs training, you will gain access to command: M-x write-thesis RET

Err... I cannot find that in the manual... What does this command do when invoked with a prefix argument? I am also confused about the implementation of this command. How is the interaction between the supervisor and student simulated in lisp? And what function does emacs use to emulate extracting that last chapter before the deadline from the student, and the student getting the supervisor to actually read the damn thing. I tried an apropos search for "thesis-blood-from-stone" but got nothing....

Without a prefix argument, it writes a master's thesis. You get a PhD thesis when you invoke it with a prefix argument, and as far as I recall, the quality of the resulting work can somehow be tuned by using numeric arguments. However, to avoid flooding the libraries on earth, I have heard that the command can only be invoked exactly once per user.

Yes. You can imagine my dismay when I accidentally typed M-x write-thesis RET rather than the intended M-x write-the-sis RET. Perhaps when 21 is released I will get another shot. It is simply crushing to think I may have to write a thesis the old-fashioned way.

Don't just whine about it here! Submit a bug report with M-x report-emacs-bug RET If you find some point of the documentation lacking or unclear. How do you expect the Emacs documentation ever to improve if the users are too lazy to even report the bugs and deficits they encounter? Sheesh, kids these days, they expect everything to be prepared for them, and have no sense of giving back! When I was young, we didn't ask what Emacs could do for us. We asked what we could do for Emacs. Kids of today could learn *a lot* from that!

What does the command do if you call it programmatically?

Writes multiple theses, of course. What did you expect? Please read tutorial (type C-h t) before bothering with such elementary questions. Each message costs the net hundreds if not thousands of dollars.

(Poor fellow replied...) And you there, yes, you man. Don't attempt to answer a question when you obviously haven't a clue. Maybe you "tested" the command, and it did as you said, but that is just an accident. The type of thesis generated depends on 1) the previous generated thesis1, and 2) an examination of the content of all the files the user have opened with Emacs2. It is not like the command is magic or anything.

Footnotes: [1] So if the previous generated thesis was a Master Thesis, the next will default to a PhD. Thesis. [2] So use W3 to read as many relevant online articles as possible, before invoking the command. And don't browse for porn unless that is what you want to graduate in.

What a stupid user interface. Maybe you elders were content with something like that, but it is certainly not the type of thing users would expect in the 21st century. I bow before the enormous wisdom that must have gone into M-x write-thesis, but we need to find a way to use it effectively.

What if I need to write multiple Master's Theses before embarking on my first PhD? And what if I write multiple PhD theses, and then again, a Master's Thesis to qualify for yet another PhD? Clearly, these possibilities weren't considered at all when designing the user interface of M-x write-thesis; you elders were content with that simplistic default mode (and DON'T tell me that I just need to hack a few lisp expressions to get what I want. I'm not attempting to write a PhD about EMACS, and besides I've got other things to do than spending hours or even days for writing a thesis!).

When Emacs prompt you with: Thesis level (default Master): press TAB to see a list of available choices, then type the name of the one you prefer. You can use TAB to complete the answer after typing a unique prefix, or (I know you young ones love this) choose an answer by clicking the middle button while the mouse pointer is above the answer in the Completions buffer. If you don't have a mouse and are afraid to type, you can even switch to the Completions buffer, move the cursor to the answer, and press RET to select it. Isn't that amazing!

I don't see how using the prefix argument to write multiple theses makes any sense at all. By what do these theses differ, then? They are all based on the currently loaded buffers, no? So am I supposed to actually READ them and find out which I like most or what?

And what if I write multiple PhD theses, and then again, a Master's Thesis to qualify for yet another PhD? I suggest using the prefix argument to distinguish between a Master's Thesis and a PhD Thesis, period. Very simple, very easy to understand. Just a pity that this change won't make it into Emacs 21.1 anymore, as we're already too late in the pretest.

This would make it inconsistent with self-insert-command. Or do you propose that self-insert-command should be modified as well, so the prefix argument changes the inserted character? I can see it now, C-u 2 i inserts k, C-u - 2 i inserts g. Another choice: Switch to XEmacs, and you'll have it. The code has been written since Emacs 18.62, but GNU refused to accept it because M-x write-thesis won't print the standard GPL blurb before the thesis and the assignment paper after it...

I wonder how do I choose between *roff and LaTeX as the thesis format? Hm. [time passes] Ah, see the variable write-thesis-format.

Just a warning, it doesn't work if you set it directly. Either call set-thesis-format from your .emacs, or set the variable with Customize.

[Q1] All this stuff seems to be very complicated to a beginner like me. Anybody can send me some code to put a easily accessible menu option to write my thesis? I don't see the point in spend time learning new key-combos and writing things only to write my thesis. Just two mouse clicks should be enough (or one, with the new buttons of the GNU Emacs 21).

[Q2] I remember a neat hack floating around that allowed you to specify the subject with a prefix argument, in case you've browsed too much crappy sites.

Prefix argument... sigh. Not me, but the standard thesis package has thesis-ignored-buffers, which is a regexp of buffer names that will be ignored when writing the thesis. People, please read the documentation before you bother poking around so powerfull editor as Emacs. It may accidentally shut down your local area's power grid if you press wrong key sequences (and don't try that at home!).


5.0 Win32 platform

5.1 Win32 Emacs ports

Homepage: and FAQ at http://www.gnu.org/software/emacs/windows/ntemacs.html
Download: ftp://ftp.gnu.org/gnu/windows/emacs
Cygwin: Emacs is in included in http://www.cygwin.com/
. Tip for debugging: xemacs -vanilla -debug-paths

In the download site, barebin has just the .exe's and a few other files, and is only useful in conjunction with the "src" tarball. This gives you the full source to everything, if you happen to want that. bin is usable by itself, but doesn't include the elisp source (that is provided by the "lisp" tarball). If you know you want the elisp source, you can just get "fullbin", which is basically "bin+lisp". leim is the Library of Emacs Input Methods, which is only of interest if you want to enter non-ascii characters in a convenient way. Emacs DOS port is (was?) maintained by Eli Zaretskii. See "NT Emacs Installation" <http://www.charlescurley.com/emacs.html> if the Emacs NT FAQ is too thick to for one coming from Windows background.

5.2 Win32 XEmacs ports

There are two versions of XEmacs available for Windows platform. A Cygwin version, which is more like the "real thing" and a native Win32 version, also called the 'netinstall' version. The development of native version is coordinated by a mailing list at xemacs-nt@xemacs.org. If you are willing to contribute or want to follow the progress, mail to xemacs-nt-request@xemacs.org to subscribe.

Win32 native: ftp://ftp.xemacs.org/pub/xemacs/windows/setup.exe
Official: ftp://ftp.xemacs.org/pub/xemacs/binary-kits/win32/
http://www.xemacs.org/faq/xemacs-faq.html#Q1_0_10
ftp://ftp.xemacs.org/pub/xemacs/beta/
Hyperarchive: http://www.xemacs.org/list-archives/xemacs-nt/

5.2.1 Compiling XEmacs with Cygwin

[Cygwin-L 2000-07-28 Rod Whitby] XEmacs 21.1.10, 21.2.34 and 21.2.35 have all compiled out of the box for me with Cygwin 1.1.2 and the pre-release 1.1.3, using the following configure line for Cygwin. There is one small problem with building 21.2.35 where src/xemacs.exe is not getting the executable bit set during the build (when dumped from temacs.exe). Just "chmod ugo+x src/xemacs.exe", and type make again.

      ./configure --with-x=no --site-includes=/usr/local/include \
      --site-libraries=/usr/local/lib --with-dragndrop

      ./configure  \
      --with-mule \
      --package-path=/usr/local/lib/xemacs/site-packages:/usr/local/lib/xemacs/xemacs-packages:/usr/local/lib/xemacs/mule-packages \
      --cppflags=-I/usr/local/include \
      --site-prefixes=/usr/local/pgsql \
      --with_file_coding=yes \
      --with-sound=native \
      --with_msw=no    

5.3 NTEmacs and printing

See exellent free printing utility at http://www.lerup.com/printfile and some elisp code for it from page of [Joe Casadonte]

5.3.1 NT printing

Check variables printer-name and ps-printer-name in Emacs 20.3+. Package enscript.el has also been reported to work with NTEmacs. Try to find it from ohio LCD. According to [Barry Roberts] In network do this to connect your printer to win32

      dos> net use /persistent:yes lpt1: \\server\printer    

Then use this lisp code

      (defvar my-enscript-print-dest "prn"
        "*Print destination (file).")

      (defvar my-enscript-print-program
        "d:/gnu/enscript/enscript.exe"
        "*Absolute pathname of program.")

      (defun my-enscript-print-buffer (lang program)
        "Print buffer contents using GNU enscript 1.5"
        (interactive
         (list
          (completing-read
           "Pretty print language: "
           '(("cpp" . 1)
             ;; Add more here ....)
           nil nil "cpp"))
         my-enscript-print-program)

        (let* ((dest my-enscript-print-dest)
               (headers-switch1
               (concat "--header=" (buffer-name)))
              (headers-switch2
               (concat "-E" lang))
              (out-switch
               (concat "--output=" dest))
              proc)
          (setq proc
                (start-process
                 "enscriptProcess" "*Enscript*"
                 program
                 "-T 4" "-r" "-C" "-G" "--columns=2"
                 out-switch
                 headers-switch1
                 headers-switch2))
          (process-send-string proc (buffer-string))
          (process-send-eof proc)
          (message "Buffer %s Printed to %s" (buffer-name) dest)))    

5.4 Cygwin

Cygwin is complete Unix like emulation layer for use inside Windows. It includes almost all the familiar Unix tools that are expected by Emacs: diff, patch, ls, telnet, ssh etc. Installation of Cygwin happens simply running Windows installer program setup.exe where individual packages can be selected and upgraded. See Cygwin site for more information.

REPORTING CYGWIN PROBLEMS

It would be best if you provided as much details as possible for the cygwin mailing list when you report problems. Here are couple of commands that may prove handy:

      $ cat /etc/setup/installed.db
      $ cygcheck -s -v -r
      $ strace -osomefile -f bash    

5.5 Win32 terminal programs

Note: Cygwin contains all needed terminal and connectivity programs: rxvt, ftp and ssh.

SSH - Putty
http://www.chiark.greenend.org.uk/~sgtatham/putty/
[Tom_Roche@ncsu.edu] Putty (the package, comprised of several executables) provides several way to connect via SSH. The most syntactically friendly (once configured) is 'putty', due to its 'saved session' facility.

If you start, e.g. with no options, configure a session, and save it (e.g. as 'sehr'), one can subsequently use a happy syntax (see second)

      $ putty sehrlangname.physics.ncsu.edu
      $ putty @sehr    

Putty also now has many more configuration options than formerly. Unfortunately, putty pops up a separate window, and has no command line help of which I'm aware. (And Putty in general has nonexistent documentation.) However: For a purely cmdline interface (only tested with w2k cmd.exe), one can use 'plink'. I haven't used it much: I only downloaded it for the purposes of this discussion, but I will try to use it more. For its cmdline help, just run 'plink' with no options. (Why can't 'putty' do that?). More usefully, one can do

      $ plink -ssh username@sehrlangname.physics.ncsu.edu    

and get an SSH session in the current window. Unfortunately it seems not quite so friendly as putty; however this may be due to the servers with which I use it--Solaris 6 boxes using Kerberos with RSAAuthentication. Problems noted:* I encounter a minor initial glitch. After typing my password I get the prompt

      ?7?[r?[999;999H?[6n    

where '?' are what I believe to be escapes (the single char that looks like '<-'). I can either wait a few seconds, or type enter, whereupon I get the message

      resize: Time out occurred    

After which, all is well, except that I get the raw escapes in my prompt. (putty handles this properly, but then, it's not character-mode.) The saved session functionality doesn't seem to quite work. If I do (-v for verbose)

      plink -v -ssh @sehr
      plink -v @sehr
      plink -v -ssh username@sehr    

I get (excerpted)

      username@sehrlangname.physics.ncsu.edu's password:
      Sent password
      Access denied
      Authentication refused
      username@sehrlangname.physics.ncsu.edu's password:    

and so on. Similarly without -v, but I get just the password prompt. pscp supports (what I believe to be) 'normal' SCP syntax. E.g. to copy from host to local cwd

      pscp username@host.domain:/path/to/remote/filename .    

Putty also has an ssh-agent, pageant, with which I've previously had trouble (probably should retry the new code), and an experimental SFTP client, psftp, of which I know nothing. (I.e. even less than I know about the rest :-) In short: the Putty tools allow me to connect to the servers I need, but only as long as I type a password. I have never been able to get anything working with the Kerberos servers with which I must interact that didn't require typing a password.

SecureFx
SecureFX is entirely different from sftp. It runs the FTP protocol over an SSH session, securing the FTP data connections by sending them through SSH tcpip-direct channels. sftp uses an ssh.com proprietary file-transfer protocol over an SSH subsystem channel, talking to the sftp-server on the other side. newer versions of SecureFX implement sftp, too. http://www.vandyke.com/

About SSH and Zone Alarm

A while ago i had posted a message saying that ssh routinely gets disconnected on my computer. i now think i know why - the culprit seems to be zone alarm, firewall utility. I installed ssh on my new laptop and it never gets ssh disconnected.

It's blocking keep-alives. ssh keepalives are sent at rather long intervals of time, but as far as I can see (I didn't look into it too closely) once ZA has blocked one, the ssh connection will be unusable. You should find either pop-up alerts or logged rejections or both, depending on your ZA settings. Configure it to allow them through instead of blocking them! For example, the way I set things up, the destinations to which I use ssh are in the trusted zone rather than the untrusted zone. But presumably you could configure specific exceptions even for destinations that are otherwise considered untrusted by ZA. --Alan J. Flavell flavell@mail.cern.ch 2000-12-02 comp.security.ssh

MindTerm
Another nice program you can use to tunnel the CVS communication over SSH is MindTerm. MindTerm is an SSH (currently v1.5) client program written in 100% pure Java (non-certified). An ssh applet which will forward X connections. They also do a java vnc client with built in ssh encryption which is especially useful for accessing a remote linux desktop from a windows machine with nothing useful installed on it. http://www.mindbright.se/mindterm/


6.0 Emacs tips

6.1 Emacs startup and load-path

All files must be put along the Emacs load-path. If you haven't defined your private lisp directory, it's time to mkae it.

      % mkdir $HOME/elisp    

The content of the startup file $HOME/.emacs traditionally starts with couple of path definitions

      ;; $HOME/.emacs - Emacs startup file

      ;; Load library (c)ommon (l)isp
      (eval-when-compile (require 'cl))

      ;;  Define variable where the private elisp directory root is
      (defconst my-root (expand-file-name "~/elisp"))

      ;;  Add root directory and subdirs
      (dolist (dir (list my-root
                         (concat my-root "/subdir1")
                         (concat my-root "/subdir2")))
        (if (file-directory-p dir)
            (pushnew dir load-path :test 'string=)))

      ;; End of example    

6.2 Loading files from .emacs

[Based on post 1997-08-22 gnu.emacs.help by Paul D. Smith] The first thing you should always do with any .el file you download is byte-compile it. Byte-compiling foo.el will create a file foo.elc which will load and execute a lot faster than the uncompiled .el file. (If you debug packages, then load the .el file instead, because the error gives then clear backtrace)

You can byte-compile a file from within Emacs with the command M-x byte-compile-file RET, or you can use this little command (I make it an alias):

      $ emacs -batch -q -f batch-byte-compile <file> [<file>...]    

Note that if the package contains multiple .el files you might not be able to do this as simply, since some of them might need others to be compiled. However, most such packages come with a makefile to do this for you. Next, you shouldn't use an explicit file names like this:

      (load "foo.el")    

in your $HOME/.emacs, since that forces Emacs to load the uncompiled (".el") version even if a compiled version exists. Instead, I use this syntax:

      (load "foo")    

In this case, Emacs will first try to find "foo.elc" then, if that doesn't exist, it will look for "foo.el".

      (load "foo.el")    

But that's not good enough yet. You really should not use commands like load, load-file or load-library in your startup file, instead get familiar with require command. It' similar to load commands, but it only executes once. If the file is in emacs already, it won't be loaded again.

      (require 'foo)   ;; See the provide command inside the file.    

Even, that isn't good for hard core Emacs fan. Loading a package with either way takes time. What one wants is that package only loads when it is actually used. That's where autoload comes into picture. The file's installation instruction should instruct to tell you what statement to put in your .emacs. Say foo package contains couple of user callable functions foo-1 and foo-2 that are called from keys. You do this

      ;;  Tell where the functions are located, in package "foo"

      (autoload 'foo-1 "foo" "" t)
      (autoload 'foo-2 "foo" "" t)

      ;;  Then bind the functions into keys,
      ;;  when key is pressed, the function call triggers loading
      ;;  the package

      (global-set-key "\C-cf1" 'foo-1)
      (global-set-key "\C-cf2" 'foo-2)    

Ah. No more unnecessary package loading at the emacs startup. Wait, there is still more. Somebody has 100 autoloads in his .emacs, many Emacs hook settings, endless count of private function definitions to tweak all out of Emacs.., and it still takes too much time to load all the autoload definitions from .emacs

What you need is a booster: delayed loading feature provided by Tinyload.el. If you have read this far, then continue reading more from the Tiny Tools package documentation page.

6.3 Many emacs startup files

When you start Emacs, the first file it loads is your $HOME/.emacs You can put any Emacs initializing commands there, like keybindings, color settings, package autoloads, c-mode customizations and many other things. After a while you have added pieces of code gradually to build up your own personal Emacs you notice that the startup file has grown to remarkable size and became complex. Here are some tips what you could do to arrange your setup better.

In order to cope with very large Emacs setup the files can be divided the setup to several files where each one deals with specific subject: key definitions, hook settings, Emacs default variable settings, font settings, Gnus news reader settings, dired settings etc. By doing this, one can conditionally load any of these startup settings and manage the specific area. Keep files in version control, like CVS/Subversion etc. (RCS is not that convenient) and put the startup files in separate directory. Don't mind that CVS repository now, if you're not familiar with it. Let's just say that CVS is a server based version control software. With version control, the files can be mirrored accross various accounts. The XEmacs/Emacs/Win32 differences are separated to their own rc files.

In the following example, we suppose that $HOME/elisp contains all the Emacs packages and sub directory $HOME/elisp/rc includes all the recource files (startup files) for Emacs customisation. The emacs.el doesn't have to necessarily contain many lines of code (for more advanced, see *tinyload.el). By making these symbolic links, nothing is kept in root directory:

      % ln -s $HOME/elisp/rc/emacs.el      $HOME/.emacs
      % ln -s $HOME/elisp/rc/emacs-ding.el $HOME/.gnus    

In Windows the above commands would not work, because Windows version of Emacs does not understand shortcuts. Just copy the contents of $HOME/elisp/rc/emacs.el to $HOME/.emacs and so on. The loader file emacs.el contains as few lines as possible to load the real setup. Like this:

      ;; $HOME/.emacs begin

      (load "~/elisp/rc/emacs-rc-root.el" )

      ;; $HOME/.emacs end    

The real loader emacs-rc-root.el Would then load the rest of the setup files as needed based on current host, the type of Emacs/Xemacs and other criterias. It is not possible to provide an example, because it will always be highly personal. Refer to dot-emacs links mentioned previously in this document for examples. Here are some ideas for recource files:

      emacs-rc-root.el    - Loader (the control center)
      emacs-rc-ding.el    - Gnus customizations
      emacs-rc-dired.el   - Dired customizations
      emacs-rc-font.el    - Font and color settings
      emacs-rc-kbd.el     - Emacs key bindings
      emacs-rc-nt.el      - NT/Win32 settings
      emacs-rc-mail.el    - RMAIL, mail, Gnus and other mail settings
      emacs-rc-path.el    - emacs paths: auto-mode-alist, load-path
      emacs-rc-set.el     - Basic Emacs configuration variables
      emacs-rc-time.el    - Calendar, appt.el settings
      emacs-rc-vc.el      - Version control settings
      emacs-rc-xemacs.el  - XEmacs settings
      emacs-rc-pkg-std.el - Standard Emacs package customizations
      emacs-rc-pkg.el     - Packages that do not come with Emacs    

6.4 Editing files as ROOT

A regular user cannot C-x C-f file directly, but using some other access method that changes the identity can. If FTP server is enabled, the file can be edited under another user identity:

      M-x find-file /root@hostname:/etc/X11/XF86Config    

Sometimes the root isn't allowed to login (as with ssh defaults), but in RedHat it is possible to allow local root logins by editing /etc/ftphosts. In some systems editing /etc/ftpusers makes root access global, but that's probably bad idea because the FTP sends passwords in clear text. You can also use Kai's package Tramp which is intended to access remote files using rlogin, telnet, ssh or somesuch, but it can also use su to do this. This might do what you want:

      (Using uuencode inline)
      /r@suu:root@localhost:/path/to/file
      (Using mimencode inline)
      /r@sum:root@localhost:/path/to/file    

6.5 Saving files as Unix

[Eli Zaretskii] You want the untranslated-filesystem feature. It is explained in the section "Text Files and Binary Files" (node name "Text and Binary") in the on-line manual, which see. This feature allows you to tell Emacs that certain directory hierarchies, or even an entire logical disk, require that files be saved in Unix EOL format. You can also control this on a per-file basis, by typing "C-x RET f undecided-unix RET" before saving the buffer (this only needs to be done once for each buffer). But if you routinely work with files that reside on Unix filesystems, the untranslated-filesystem feature is IMHO much more convenient.

7.0 Byte compiling files

7.1 Compiling lisp files

Substitute DIRECTORY with the directory where you're compiling the files; like "$HOME/elisp".

      % xemacs                                                  \
          --batch                                               \
          --eval '(setq load-path (cons DIRECTORY load-path))'  \
          -f batch-byte-compile package.el    

7.2 Shell alias

To make compiling files easie, a shell alias command can help. Here "_emc" means "Emacs compile" and underscore is reserved for all user's private commands so that they don't clash with the ones that are there already in the system. Pay attention to the single and double quotes, because constructing alias command in (t)csh isn't always that intuitive. The load-path setting included extra path from where to look for more lisp files during compilation in case of compiling dependencies.

      % setenv EMACS emacs
      % alias _emc "$EMACS \
            -batch -q --no-site-file  \
            -eval '(setq load-path (cons "'"~/elisp/"'" load-path))'\
            -f batch-byte-compile \!*"    

Here is equivalent bash alias:

      $  function _emc ()
         {
             ${EMACS:-"emacs"} --batch -q --no-site-file \
             --eval '(setq load-path (cons "~/elisp/" load-path))' \
             -f batch-byte-compile $*
         }    

Then you can write in shell prompt:

      $ _emc some-lib*el      # compile libs
      $ _emc *el              # then rest of the files    

7.3 Dired byte compilation

Call C-x d or M-x dired, mark lisp files and press b to byte compile selected lisp files.

8.0 Reporting bugs or improvements

8.1 Activating debug

First thing to do if you encounter an error (it is that ding tune that you hear plus a message that appears in echo area) in Emacs, you must turn on Emacs debug. In fact I would like to recommend that you keep it permanently on.

      ;; `M-x' means, press ESC x or Alt-x; which one works

      M-x set-variable RET debug-on-error RET t RET

      ;; To have it permanently on, put this into your $HOME/.emacs

      (setq debug-on-error t)    

To toggle variable easily inside emacs, put this into your .emacs init file and call M-x my-debug.

      (defun my-debug ()
        "Toggle Emacs debug on/off."
        (interactive)
        ;;  The normal debug flag
        ;;
        (setq debug-on-error (not debug-on-error))
        ;;
        ;;  Must be nil, otherwise it get's on your nervers
        ;;  too much when yo hit C-g to interrupt inputs.
        ;;  This only exists in New emacs releases.
        ;;
        (if (boundp 'debug-on-quit)
            (setq debug-on-quit nil))
        ;;
        ;;  We want to see the track that lead to error
        (if (boundp 'stack-trace-on-error)         ;; Xemacs
            (defconst stack-trace-on-error t))
        ;;
        (if (boundp 'debug-on-signal)   ;;  This must *not* be on!
            (setq debug-on-signal nil))
        ;;
        ;;  Tell me about all errors
        (if (boundp 'debug-ignored-errors)
            (setq debug-ignored-errors nil))
        ;;
        (if debug-on-error
            (message "debug-on-error is t")
          (message "debug-on-error is nil")))
      ;; End of code    

8.2 Use uncompiled packages

If you get an error from some package, immediately load the uncompiled version. The error message in byte-compiled format is usually impossible to read by any maintainer. So do this immediately when you encounter an error

8.3 Use package's contact function

Please report bugs of individual files with their associated contact functions. And they are not just for bug reporting only, but any time you want to talk with the maintainer, prefer using those contact functions. You save him from lot of asking and guessing: this is very important, because they automatically send valuable information about

Packages may have one or more reporting functions. The XXX is package id, normally a short identifier which is in package's functions. Like for C++ mode the id would be cc-mode. Use the bug function, if it exists, over the other feedback functions. If none of these functions are available, look at the package source for Maintainer: and send message there.

      XXX-submit-bug-report
      XXX-submit-feedback    

8.4 Requesting changes

Before you do anything, make sure you have the latest version. Visit the download site (see source code or docs for any ULR pointer) to be sure. Next, contact maintainer of the package and describe the nature of a problem or suggestion with examples. Discuss with the maintainer first before you go and change something in the packages. If you do minor adjustments like add new hooks, add support to a new platform, then you can follow these steps.

          % cp package.el package.el.orig    

          % diff -ubw package.el.orig package.el > package.el.diff    


9.0 Library kits

9.1 CEDET, Collection of Emacs Dev Env Tools

[Eric Ludlam] See http://cedet.sourceforge.net for project speedbar, EDE, quickpeek, semantic, EIEIO

      $ cvs -d:pserver:anonymous@cvs.cedet.sourceforge.net:/cvsroot/cedet login
      $ cvs -d:pserver:anonymous@cvs.cedet.sourceforge.net:/cvsroot/cedet co cedet    

9.2 Tiny Tools kit

Cross platfrom compatible (Emacs/XEmacs/NTEmacs/Win32 XEmacs) files at http://tiny-tools.sourceforge.net

9.3 Ttn Emacs kit

[Nguyen Thien-Thi] 1998-07. This is basically my emacs (and thus Total Computing Experience) environment, including lots of funcs (autoloaded), key-bindings, etc. the key binding is selective, designed for export. (in the future, i'd like to generalize this kind of packaging so that it is easy for anyone to publish their library compatibly ... anyone want to help?) The subdir lisp/import contains work by others; see file AUTHORS for attribution. if i've made a mistake, please let me know. http://www.glug.org/people/ttn/software/ttn-pers-elisp

10.0 Gnus

10.1 Gnus homepage

Gnus is a newsreader as well as mailreader, but not in traditional sense. It is a hybrid, where it stamps label Mail to anything that you point it to: mailing lists, multiple POP accounts, multiple IMAP accounts, search engines, slashdot articles, reading documents, digests, just about anything that can be read and processed. It supports MIME, PGP, and PGP/MIME, possibly S/MIME in the future.

Other popular Emacs mail user agents are VM and RMAIL. RMAIL you probably should avoid because it uses non-standard mailbox format called babyl. In case you need by accident hit rmail, then use M-x unrmail and to b2m binary to conver the $HOME/RMAIL mailbox back to unix mailbox. To move mail back to your Unix account mailbox /var/spoo/mail/$USER, use program unmovemail.

Development versions:

      cvs -d :pserver:gnus@cvs.gnus.org:/usr/local/cvsroot login
      password: gnus
      cvs -d :pserver:gnus@cvs.gnus.org:/usr/local/cvsroot co gnus    

10.2 Gnus-eyecandy.el

[Bryan Johnson] gnus-eyecandy.el allows you to gratuitously add icons to your group buffer in a manner similar to the way that you currently specify group highlighting, ie a Form/File alist rather than a Form/Face alist. Like all eyecandy, it will slow down your application, but if you don't go too crazy, it shouldn't slow things down too much.

10.3 Gnus-bbdb.el (*)

[Brian Edmonds] Gnus functions which utilize bbdb data. Patch some gnus internals to allow BBDB information to infect the summary buffer. Also can be used in mail splitting.

Soren Dayton csdayton+usenet@cs.uchicago.edu comments:

  1. it has a structural distinction between mailing lists and people as entries in the BBDB. I do not think that this is quite right because they are really entirely different kinds of media.
  2. It does not completely seperate out mailing list stuff from normal mail. I would like to do this.
  3. It is not all that extensible.

So I wrote some stuff that is a bit more personalized to do it. It follows if anyone cares....it uses procmail's foo+bar convention for mailing lists. It is also pretty easy to add new things to (like spam filters, which might be an addition to csd-gnus-split-method-list).

=> csd-gnus-split.el - gnus functions which utilize bbdb data

10.4 Gnus-filterhist.el

[Bryan Johnson] 1999-12. gnus-filterhist.el creates a buffer with a summary of the number of messages you've received per mailbox. This summary is cleared every time you check mail. gnus-filterhist has the concepts of current split history and session split history. If you make gnus-filter-history-show-session-history non-nil it will show where mail has been split this session (a session being defined as the time since you started gnus or cleared the session history). If you make gnus-filter-history-show-current-split-history non-nil, it will show you what was split the last time you checked mail. These are independent from each other, so you can have either or both. If you have both, the session history will show up no matter what, and the current-split will display the message "- No Current Split -" if there was no new mail the last time you checked. Both the session history and the current split show up in the Filter History buffer.

10.5 Gnus-junk.el, Send UBE complaint

[Robert Bihlmeyer] What you need to do is spot the junk mail and start gnus-junk-complain. This function will study the headers of the current message, gather a number of admin-addresses from them, and pop-up a mail-buffer with the proper "To:"- and "Subject:"-headers, and a standard text. A copy of the offending message is also appended. You can then check the constructed mail (mainly, the "To:"-line) for sanity, apply corrections, and send it.

10.6 Gnus-ml.el, Mailing list minor mode for gnus (*)

[2000-03-15 Gnus-L Message-ID: <tn66uol6ni.fsf@bcv01xc7.vz.cit.alcatel.fr> by Julien Gilles] Some weeks ago someone mentioned the RFC 2369, about "The Use of URLs as Meta-Syntax for Core Mail List Commands and their Transport through Message Header Fields". E.g. my group parameters for nnml:ding

      ((to-address . "ding@gnus.org")
       (to-list . "ding@gnus.org")
       (total-expire . t)
       (expiry-wait . 20)
       (admin-address . "ding-request@gnus.org")
       (list-help "<EM>mailto:ding-request@gnus.org?subject=help</EM>")
       (list-unsubscribe "<EM>mailto:ding-request@gnus.org?subject=unsubscribe</EM>")
       (list-subscribe "<EM>mailto:ding-request@gnus.org?subject=subscribe</EM>"))    

10.7 Gnus-todo.el

#todo: Where is this? ftp://ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/

10.8 Deja.el, Search dejanews with nnweb

[Stephen Tse] nnweb is a nice piece of work, but is well-known to be broken for Deja search. I personally do Deja search daily and thus start this random hack. I separate it from the original nnweb.el file because this file needs constant updates to catch up with changes of www.deja.com interface.

10.9 Message-utils.el

Holger Schauer

10.10 Message-x.el, customizable completion in message headers

[Kai Grossjohan] This assigns a context-sensitive function to the TAB key in message mode of Gnus. When in a header line, this performs completion based on which header we're in (for example, newsgroup name completion makes sense in the Newsgroups header whereas mail alias expansion makes sense in the To and Cc headers). When in the message body, this executes a different function, by default it is indent-relative.

See also similar utility tinymail.el.

10.11 Messkeyw.el, automatic keyword support during composition

[Karl Kleinpaste] This provides a hookable mechanism by which to have Keywords headers automatically generated based on word frequency of the body. The goal is to make it possible to score on Keywords provided, of course, that Keywords gets to the overview files.

10.12 Ngn.el, insert newsgroup name into buffer using completion

[Dave Pearson] 2000-11. ngn.el provides commands for quickly inserting a newsgroup name into a buffer.

10.13 Nnmaildir.el, one group per maildir

http://cr.yp.to/proto/maildir.html #todo: in Gnus?
http://multivac.cwru.edu/prj/nnmaildir.el

[Paul Jarc] 2000-06. Having only one group per maildir simplifies things greatly in nnmaildir; .qmail files can be used to filter messages into the appropriate places. A select method now looks like this:

      '(nnmaildir "whatever"
                  (nnmaildir-groups (("groupname1" "/path/to/maildir1")
                                     ("groupname2" "/path/to/maildir2"))))    

If there is only one group, it doesn't need to be put in a list. The select method is destructively modified behind your back by nnmaildir-open-server - I don't think this will cause problems, will it? I think nntp.el does it too.

If you were using the old version, migration will be mildly painful. (But it shouldn't be in the future.) First, kill (not just unsubscribe) all your nnmaildir groups. Now, in the cur/ directory in each of the maildirs you're using, execute this command: bash -c 'for i in *; do mv "$i" ../new/"${i%%:*}"; done' That will make all messages appear as new again. Now set up your new select method, fire up Gnus, and re subscribe to your groups.

10.14 Nnir.el, search mail with various search engines

[Kai Großjohann] What does it do? Well, it allows you to index your mail using some search engine (freeWAIS-sf and Glimpse are currently supported), then type `G G' in the Group buffer and issue a query to the search engine. You will then get a buffer which shows all articles matching the query, sorted by Retrieval Status Value (score).

When looking at the retrieval result (in the Summary buffer) you can type `G T' (aka M-x gnus-summary-nnir-goto-thread RET) on an article. You will be teleported into the group this article came from, showing the thread this article is part of. (See below for restrictions.)

The Lisp installation is simple: just put this file on your load-path, byte-compile it, and load it from $HOME/.gnus or something. This will install a new command `G G' in your Group buffer for searching your mail.

10.15 Nnir-grepmail.el, A grepmail plugin for nnir.el

[Nevin Kapur] This is a plugin for nnir.el to use grepmail as its search engine. To use it, put the following in your ~/.gnus:

      (require 'nnir-grepmail)
      (setq nnir-search-engine 'grepmail)    

If you have only one nnml and only one nnfolder backend and they are both part of your gnus-secondary-select-methods, then that should be it. Otherwise, you may need to customize the variables nnir-grepmail-nnml-backend and nnir-grepmail-nnfolder-backend. The defaults are guessed from your gnus-secondary-select-methods which may or may not be right.

10.16 Fogey-subscribe.el

[Martin Fouts] I wanted a slightly more complex set of rules for auto subscribing than I could get with the default functions, so Lars suggested that I would need to write my own gnus-subscribe-newsgroup-method which I did. In the process I realized that one could generalize my approach to allow a great deal of flexibility in newsgroup subscribing rules, and so, here, after a brief test, is my trio of such methods.

10.17 Rmail-spam-filter.el

[Eli Tziperman] 2000-11. For all you rmail users that always wanted to filter spam in rmail. You can define what spam is via custom (menubar -> help -> customize -> specific group -> rmail-spam-filter <enter>), where you can specify which senders, recipients, subjects and/ or contents are considered spam (example below), and you'll never see these again. The spam can either be automatically saved to a spam-rmail file and deleted from your main rmail file, or just automatically deleted. This filter works with a regular spool mail file, as well as with pop servers. You do not need to setup any external filter programs and the interface with the filter is entirely via emacs's customize utility. Tested in Gnu Emacs 20.6 and 21.0.

10.18 TinyGnus.el, additional gnus utilities

See Tiny Tools kit.

10.19 Uce.el, reply to unsolicited commercial email

[Stanislav Shalunov shalunov@mccme.ru] 2000-05. Code in this file provides semi-automatic means of replying to UCE's you might get. It works currently only with Rmail and Gnus. If you would like to make it work with other mail readers, Rmail-specific section is marked below. If you want to play with code, please let me know about your changes so I can incorporate them. I'd appreciate it.

Function uce-reply-to-uce, if called when current message in RMAIL buffer is a UCE, will setup mail buffer in the following way: it scans full headers of message for 1) normal return address of sender (From, Reply-To lines); and puts these addresses into To: header, it also puts abuse@offenders.host address there 2) mailhub that first saw this message; and puts address of its postmaster into To: header 3) finally, it looks at Message-Id and adds posmaster of that host to the list of addresses. Then, we add "Errors-To: nobody@localhost" header, so that if some of these addresses are not actually correct, we will never see bounced mail. Also, mail-self-blind and mail-archive-file-name take no effect: the ideology is that we don't want to save junk or replies to junk.

10.20 Spamprod.el, generate spam complaint email

[Neil Dyke] 2000-10. Given a spam email message in Emacs, spamprod.el generates a complaint email addressed to various parties who are hopefully in a position to do something about curtailing the spam. Brief backgrounder rant (can be safely ignored): Spam is typically the product of individuals who would choose to annoy one hundred thousand people if it enabled them to make US$24.95 from just one of those people. Spammers are freeloaders in the sense that they ignore the societal constraints that for most people preclude sending an email message to massive numbers of others. Spammers typically operate anonymously or with throwaway pseudonymous identities, which means they have no investment in social reputation that could be an object of direct anti-spam pressure. However, spammers are dependent on providers of Internet infrastructure, and are therefore vulnerable to anti-spam social pressure placed upon the providers. Many providers do not want to harbor or facilitate spammers, and need to be informed of spam incidents - both to try to thwart the spammer of the particular incident, and also to have a better sense of the magnitude of spam incidents and whether additional proactive anti-spam measures are called for. Venting is also good. Legislation is sometimes appropriate, but can have really nasty side-effects.

10.21 Vcard.el (*)

[Noah Friedman] Distributed with latest Gnus.

11.0 Mail

11.1 Getting remote mail

POP3 Post offfice protocol
http://www.faqs.org/rfcs/rfc1939.html

IMAP
http://www.imap.org/
ftp://ftp.cac.washington.edu/imap/ See IMAP vs. POP file
If you have the option, we recommend using or installing an IMAP4rev1 server; it has the best facilities for tracking message seen states. It also recovers from interrupted connections more gracefully than POP3, and enables some significant performance optimizations. --Fetchmail FAQ.

Fetchmail (Unix only)
http://www.fetchmail.org/
esr@thyrsus.com Eric S. Raymond
MailingList: fetchmail-friends-request@thyrsus.com

Fetchmail is a one-stop solution to the remote mail retrieval problem for Unix machines, quite useful to anyone with an intermittent PPP or SLIP connection to a remote mailserver. It can collect mail using any variant of POP or IMAP and forwards via port 25 to the local SMTP listener, enabling all the normal forwarding/filtering/aliasing mechanisms that would apply to local mail or mail arriving via a full-time TCP/IP connection. --FAQ

Programs for remote mail service via POP or IMAP
http://metalab.unc.edu/pub/Linux/system/mail/pop/!INDEX.html
For Win32 see HAMSTER small news/pop/smtp server at http://freebee.home.pages.de/ and http://home.t-online.de/home/juergen.haible/

11.2 Bbdb.el, email database (*)

http://bbdb.sourceforge.net/
http://www.waider.ie/hacks/emacs/bbdb/
Maintainers: Ronan Waide and Matt Simmons
Original Author: Jamie Zawinski
MailingList: bbdb-info-request@xemacs.org
This package is part of XEmacs

Big Brother Database: store information about your email friends easily. Integrates to mail, VM, RMAIL, GNUS. Jamie wrote it and Matt maintains the package.

      cvs -d :pserver:anonymous@cvs.bbdb.sourceforge.net:/cvsroot/bbdb login
      password: [hit enter]
      cvs -d :pserver:anonymous@cvs.bbdb.sourceforge.net:/cvsroot/bbdb co bbdb    

BBDB/LDAP
See developer [Oscar Figueiredo] and visit his site.

Other