For more configuration options and another example of this hook, look
further down in this README.

TAB Theory

It goes like this: when you press TAB, we indent the line unless
doing so would make the current line more than two indentation levels
deepers than the previous line. If that's the case, remove all
indentation.

Consider this code, with point at the position indicated by the
caret:

line1()
line2()
line3()
^

Pressing TAB will produce the following code:

line1()
line2()
line3()
^

Pressing TAB again will produce this code:

line1()
line2()
line3()
^

And so on. I think this is a pretty good way of getting decent
indentation with a whitespace-sensitive language.

Newline and Indent

We all love hitting RET and having the next line indented
properly. Given this code and cursor position:

line1()
line2()
line3()
^

Pressing RET would insert a newline and place our cursor at the
following position:

line1()
line2()
line3()
^

In other words, the level of indentation is maintained. This
applies to comments as well. Combined with the TAB you should be
able to get things where you want them pretty easily.

Indenters

class, for, if, and possibly other keywords cause the next line
to be indented a level deeper automatically.

For example, given this code and cursor position::

class Animal
^

Pressing enter would produce the following:

class Animal
^

That is, indented a column deeper.

This also applies to lines ending in ->, =>, {, [, and
possibly more characters.

So this code and cursor position:

$('#demo').click ->
^

On enter would produce this:

$('#demo').click ->
^

Pretty slick.

imenu

If you're using imenu, coffee-mode should work just fine. This
means users of textmate.el will find that ⇧⌘T
(textmate-go-to-symbol) mostly works as expected.

If you're not using imenu check out this page or textmate.el for
a really awesome way to jump quickly to a function's definition in a
file.

Commands

If you have easymenu you can get to any of these commands from the
menu bar:

coffee-compile-file

Compiles the current file as a JavaScript file. Doesn't open it or
anything special for you.

Operating on "basic.coffee" and running this command will save a
"basic.js" in the same directory. Subsequent runs will overwrite the
file.

coffee-compile-buffer

Compiles the current buffer to JavaScript using the command specified
by the coffee-command variable and opens the contents in a new
buffer using your JavaScript mode of choice. The JavaScript mode is
determined by the coffee-js-mode variable and defaults to js2-mode.

Bind it:

(define-key coffee-mode-map [(meta r)] 'coffee-compile-buffer)

coffee-compile-region

Compiles the selected region to JavaScript using the same
configuration variables as coffee-compile-buffer.