Categories: geek » emacs » elisp

View topic page - RSS - Atom - Subscribe via email

Learn Emacs Lisp by reading Emacs Lisp

Posted: - Modified: | emacs, elisp

Learning Emacs Lisp can help you really tweak your Emacs environment to fit you, saving time, smoothening out frustrations, and making things easier. Reading code is an essential part of learning how to code. By reading other people’s code, you’ll not only discover interesting syntax and library features, but you’ll also start absorbing the idioms – the ways of doing things. (This is why it’s important to read good, well-formatted code.)

Where to find code

You can use C-h k (describe-key) to explore the code behind keystrokes, menu items, and mouse actions. If the source code is installed, you should see a hyperlink in the information window that appears. It’s a good idea to install the Emacs Lisp source code for Emacs.

If you know the name of the function you’re interested in, C-h f (describe-function) will link to the source code and describe the function.

You can find lots of other Emacs code snippets on http://emacswiki.org and in blog posts on http://planet.emacsen.org . gnu.emacs.sources and other Emacs-related newsgroups or mailing lists are useful, too.

How to understand code

At first glance, Emacs Lisp looks like a mess of parentheses and strange incantations. setq? defun? cdar?

This is true at second glance, too.

Read through the Emacs Lisp intro manual either online or in Emacs (C-h i m Emacs Lisp Intro). You’ll probably understand very little the first few times through. This is okay. All you need to do is get a vague idea of what things are called so that you can look them up when you need to.

Now read your code again. Slightly of it should make sense.

Skim the Emacs Lisp manual, too. This is a reference, so you’ll understand even less of it as an Emacs Lisp newbie, but it’s good for picking up terms.

You don’t need to understand all of Emacs Lisp in order to take advantage of other people’s configuration snippets. You’ll learn things along the way.

Make liberal use of C-h f to describe functions and C-h v (describe-variable) to investigate. You can jump to function definitions with find-function, which is worth binding to a keystroke. For example, to map F8 to find-function temporarily, use M-x global-set-key RET F8 find-function.

How to step through code

Edebug is an interactive debugger for Emacs so that you can step through the code instead of guessing what the code will do. (Edebug documentation) Use M-x edebug-defun to prepare the function you’re interested in, then run the function. Press SPC to step through the code, e to evaluate expressions (you can use this to find the values of numbers), h to continue until the specified point, b to set a breakpont, g to execute until a breakpoint, and q to stop debugging.

Super awesome.

How to make code your own

You can copy code to the *scratch* buffer or another file, tweak it a little, evaluate or edebug the code, and see what changed. If you like your changes, you can:

  • rename the function and add it to your configuration file,
  • use advice to modify the existing function, or
  • redefine the function (keeping the name as-is) and adding it to your configuration file. (This can lead to weird behaviour, so do this carefully!)

Enjoy!

Other reading:

EmacsWiki: Learn Emacs Lisp

Thanks to bl3u for the nudge to write about this!

Emacs Gnus: Filter Spam

Posted: - Modified: | emacs, wickedcoolemacs, elisp, gnus, mail

(draft for an upcoming book called Wicked Cool Emacs)

Ah, spam, the bane of our Internet lives. There is no completely
reliable way to automatically filter spam. Spam messages that slip
through the filters and perfectly legitimate messages that get
labelled spam are all part of the occupational hazards of using the
Internet.

The fastest way to filter spam is to use an external spam-filtering
program such as Spamassassin or Bogofilter, so your spam can be
filtered in the background and you don’t have to spend time in Emacs
filtering it yourself. In an ideal world, this would be done on the
mail server so that you don’t even need to download unwanted
messages. If your inbox isn’t full of ads for medicine or stocks, your
mail server is probably doing a decent job of filtering the mail for
you.

Server-based mail filtering

As spam filtering isn’t an exact science, you’ll want to find out how
you can check your spam folder for misclassified mail. If you download
your mail through POP, find out if there’s a webmail interface that
will allow you to check if any real mail has slipped into the junk
mail pile. If you’re on IMAP, your mail server might automatically
file spam messages in a different group. Here’s how to add the spam
group to your list of groups:

  1. Type M-x gnus to bring up the group buffer.
  2. Type ^ (gnus-group-enter-server-mode).
  3. Choose the nnimap: entry for your mail server and press RET (gnus-server-read-server).
  4. Find the spam or junk mail group if it exists.
  5. Type u (gnus-browse-unsubscribe-current-group) to toggle the subscription. Subscribed groups will appear in your M-x gnus screen if they contain at least one unread message.

Another alternative is to have all the mail (spam and non-spam)
delivered to your inbox, and then let Gnus be in charge of filing it
into your spam and non-spam groups. If other people manage your mail
server, ask them if you can have your mail processed by the spam
filter but still delivered to your inbox. If you’re administering your
own mail server, set up a spam filtering system such as SpamAssassin
or BogoFilter, then read the documentation of your spam filtering
system to find out how to process the mail.

Spam filtering systems typically add a header such as “X-Spam-Status”
or “X-Bogosity” to messages in order to indicate which messages are
spam or even how spammy they are. To check if your mail server tags
your messages as spam, open one of your messages in Gnus and type C-u
g (gnus-summary-show-article) to view the complete headers and
message. If you find a spam-related header such as X-Spam-Status, you
can use it to split your mail. Add the following to your ~/.gnus:

 (setq spam-use-regex-headers t) ;; (1)
 (setq spam-regex-headers-spam "^X-Spam-Status: Yes")   ;; (2)
 (require 'spam) ;; (3)
 (spam-initialize) ;; (4)

This configures spam.el to detect spam based on message
headers(1). Set spam-regex-headers-spam to a regular expression
matching the header your mail server uses to indicate spam.(2) This
configuration should be done before the spam.el library is loaded(3)
and initialized(4), because spam.el uses the spam-use-* variables to
determine which parts of the spam library to load.

In order to take advantage of this, you’ll also need to add a rule
that splits spam messages into a different group. If you haven’t set
up mail splitting yet, read qthe instructions on setting up fancy mail
splitting in “Project XXX: Organize mail into groups”. Add (:
spam-split) to either nnmail-split-fancy or nnimap-split-fancy,
depending on your configuration. For example, your ~/.gnus may look
like this:

(setq nnmail-split-fancy
'(
;; ... other split rules go here ...
(: spam-split)
;; ... other split rules go here ...
"mail.misc")) ; default mailbox

(draft for an upcoming book called Wicked Cool Emacs, more to come!)