Skip to content
Emacs Major Mode for CoffeeScript
Emacs Lisp Makefile
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.


Type Name Latest commit message Commit time
Failed to load latest commit information.
examples Update example Feb 10, 2014
image Replace screenshot because link of old one is dead Feb 24, 2015
test Add test of string interporation in comment Mar 24, 2017
.gitignore Update ignore list for Cask Feb 15, 2015
.travis.yml Drop Emacs 24.1 and 24.2 support Nov 23, 2016
Cask Fix for using Cask Feb 15, 2015
Makefile Improve Makefile for testing macOS Mar 24, 2017 Update document Nov 24, 2016
coffee-mode.el Merge pull request #363 from millerjs/fix-multiline-comments Mar 15, 2020

CoffeeScript Major Mode

travis badge melpa badge melpa stable badge

An Emacs major mode for CoffeeScript and IcedCoffeeScript.

Provides syntax highlighting, indentation support, imenu support, a menu bar, and a few cute commands.



  • Emacs 24.3 or higher
  • CoffeeScript 1.9.3 or higher

Installation via package.el

coffee-mode is available on MELPA and MELPA-STABLE.

You can install coffee-mode with the following command.

M-x package-install [RET] coffee-mode [RET]

Please do not install GNU Emacs Lisp Package Archive version.

It's too old and many features(Block string, block comment etc) are not implemented.


coffee-mode used to offer automatic deletion of trailing whitespace. This is now left to whitespace-mode. See its documentation for full details, but as a hint, configure:

;; automatically clean up bad whitespace
(setq whitespace-action '(auto-cleanup))
;; only show bad whitespace
(setq whitespace-style '(trailing space-before-tab indentation empty space-after-tab))

Then turn on whitespace-mode, or global-whitespace-mode.


To set the number of spaces used with each additional indentation, add this to your .emacs or init.el or other initialization file:

;; This gives you a tab of 2 spaces
(custom-set-variables '(coffee-tab-width 2))

coffee-tab-width is buffer local variable. You can set indentation size per buffer by using File Variables.

# Local variables:
# coffee-tab-width: 4
# End:

Using TAB

Set coffee-indent-tabs-mode t if you want to use TAB instead of spaces.

Move to corresponding point in JavaScript file after compiling

You can archive this with sourcemap and following configuration.

You can install sourcemap package from MELPA.

;; generating sourcemap by '-m' option. And you must set '--no-header' option
(setq coffee-args-compile '("-c" "--no-header" "-m"))
(add-hook 'coffee-after-compile-hook 'sourcemap-goto-corresponding-point)

;; If you want to remove sourcemap file after jumping corresponding point
(defun my/coffee-after-compile-hook (props)
  (sourcemap-goto-corresponding-point props)
  (delete-file (plist-get props :sourcemap)))
(add-hook 'coffee-after-compile-hook 'my/coffee-after-compile-hook)


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.

Default Key Bindings

Key Command
C-m, Return Insert newline and indent line
C-c C-<, backtab Indent line or region to left
C-c C-> Indent line or region to right
C-M-a Move to beginning of defun
C-M-e Move to end of defun
C-M-h Mark this defun
A-r, C-c C-k Compile buffer to JavaScript
A-R Compile content of region to JavaScript
A-M-r, C-c C-z Run CoffeeScript REPL
C-c C-l Send this line to REPL buffer
C-c C-r Send content of region to REPL buffer
C-c C-b Send content of buffer to REPL buffer
C-c C-o C-s Enable coffee-cos-mode

C-m and Return key insert newline and indentation. If you don't want indentation please overwrite it as below.

(define-key coffee-mode-map (kbd "C-m") 'newline)



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

coffee-mode menu bar


Launch a CoffeeScript REPL


Compile buffer to JavaScript.


Compile region to JavaScript


Run coffee with the --watch flag on a directory or file.


Minor mode for compiling to JavaScript at save file.


Minor mode for compiling buffer in real time.


Indent like python-mode

When coffee-indent-like-python-mode is non-nil, indent command works like python-mode. I suppose that Evil's o and O commands works as you expect with this option.

 '(coffee-indent-like-python-mode t))

Sample Configuration

;; coffeescript
 '(coffee-tab-width 2)
 '(coffee-args-compile '("-c" "--no-header" "--bare")))

(eval-after-load "coffee-mode"
     (define-key coffee-mode-map [(meta r)] 'coffee-compile-buffer)
     (define-key coffee-mode-map (kbd "C-j") 'coffee-newline-and-indent)))


Please file bugs at

You can’t perform that action at this time.