This manual is for Haskell mode, version 13.12
Copyright © 2013 Haskell Mode contributors.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts and no Back-Cover Texts.
Next: Introduction, Up: (dir) [Index]
Haskell Mode is an Haskell development Environment for GNU Emacs version 23 or later. It provides syntax-based indentation, font locking, editing cabal files, and supports running an inferior Haskell interpreter (e.g. GHCi).
Next: Getting Help and Reporting Bugs, Previous: Top, Up: Top [Index]
Haskell Mode is a major mode providing a convenient environment for editing Haskell programs.
Some of its major features are:
Next: Getting Started, Previous: Introduction, Up: Top [Index]
This Info manual is work in progress and incomplete. However, you can find more information at these locations in the meantime:
If you have any questions or like to discuss something regarding Haskell Mode, please consider sending an email to the Haskellmode-emacs mailing list. The mailing list is also available on Gmane via the gmane.comp.lang.haskell.emacs newsgroup.
If you have discovered a bug or wish to request a new feature, you can file a new issue with Haskell Mode’s issue tracker. When filing a bug, please state your currently used software version (M-x haskell-version, M-x version) and what steps to perform in order to reproduce the bug you’re experiencing. Finally, if you happen to be proficient in (elisp)Emacs Lisp you are welcome to submit patches via GitHub Pull Requests.
Next: Editing Haskell Code, Previous: Getting Help and Reporting Bugs, Up: Top [Index]
If you are reading this, you have most likely already managed to install Haskell Mode in one way or another. However, just for the record, the officially recommended way is to install Haskell Mode via the Marmalade package archive which contains the latest stable release of Haskell Mode.
Most of Haskell Mode’s settings are configurable via customizable variables (see (emacs)Easy Customization, for details). You can use M-x haskell-customize to browse the haskell
customization sub-tree.
One of the important setting you should customize is the haskell-mode-hook
variable (see (emacs)Hooks) which gets run right after the haskell-mode
major mode is initialized for a buffer. You can customize haskell-mode-hook
by M-x customize-variable RET haskell-mode-hook. It’s highly recommended you set up indentation to match your preferences; See Indentation, for more details about the indentation modes included with Haskell Mode.
Next: Unicode support, Previous: Getting Started, Up: Top [Index]
Haskell Mode is actually a collection of so-called major modes1 one of which is called haskell-mode
. To avoid confusion, when referring to this package the name “Haskell mode” is written in a normal font, whereas when referring the major mode of the same name haskell-mode
written with a dash in-between in a typewriter font is used.
As one might guess, haskell-mode
is the (programming language2) major mode for editing (non-literate) Haskell source code. haskell-mode
is associated with the file extensions listed below by default3.
official file extension for (non-literate) Haskell 98/2010 files
“almost-Haskell” input file for the hsc2hs pre-processor
input file for the cpphs pre-processor
The major mode literate-haskell-mode
(which is derived from haskell-mode
and thus transitively from prog-mode
) provides support for literate Haskell programs and is associated with the .lhs file extension by default.
literate-haskell-mode
supports Bird-style as well as TeX-style literate Haskell files. The currently detected literate Haskell variant is shown in the mode line (see (emacs)Mode Line) as either ‘LitHaskell/bird’ or ‘LitHaskell/tex’.
haskell-mode
supports syntax highlighting via Emacs’ Font Lock minor mode which should be enabled by default in current Emacsen. See (emacs)Font Lock, for more information on how to control font-lock-mode
.
Next: Indentation, Previous: Editing Haskell Code, Up: Top [Index]
See the Haskell Wiki’s entry on Unicode Symbols for general information about Unicode support in Haskell.
As Emacs supports editing files containing Unicode out of the box, so does Haskell Mode. As an add-on, Haskell Mode includes the haskell-unicode
input method which allows you to easily type a number of Unicode symbols that are useful when writing Haskell code; See (emacs)Input Methods, for more details.
To automatically enable the haskell-unicode
input method in haskell-mode buffers use M-x customize-variable RET haskell-mode-hook or put the following code in your .emacs file:
(add-hook 'haskell-mode-hook 'turn-on-haskell-unicode-input-method)
To temporarily enable this input method for a single buffer you can use M-x turn-on-haskell-unicode-input-method.
When the haskell-unicode
input method is active, you can simply type ‘->’ and it is immediately replaced with ‘→’. Use C-\ to toggle the input method. To see a table of all key sequences use M-x describe-input-method RET haskell-unicode. A sequence like ‘<=’ is ambiguous and can mean either ‘⇐’ or ‘≤’. Typing it presents you with a choice. Type 1 or 2 to select an option or keep typing to use the default option.
If you don’t like the highlighting of partially matching tokens you can turn it off by setting input-method-highlight-flag
to nil
via M-x customize-variable.
Next: haskell-decl-scan-mode, Previous: Unicode support, Up: Top [Index]
For general information about indentation support in GNU Emacs, see (emacs)Indentation.
In Haskell, code indentation has semantic meaning as it defines the block structure4.
As GNU Emacs’ default indentation function (i.e. indent-relative
) is not designed for use with Haskell’s layout rule, Haskell mode includes three different indentation minor modes with different trade-offs:
turn-on-haskell-simple-indent
A very simple indentation scheme; In this scheme, TAB will now move the cursor to the next indent point in the previous non-blank line. An indent point is a non-whitespace character following whitespace.
turn-on-haskell-indent
Intelligent semi-automatic indentation for Haskell’s layout rule. The basic idea is to have TAB cycle through possibilities indentation points based on some clever heuristics.
The rationale and the implementation principles are described in more detail in the article Dynamic tabbing for automatic indentation with the layout rule published in the Journal of Functional Programming 8.5 (1998).
turn-on-haskell-indentation
Improved variation of turn-on-haskell-indent
indentation mode. Rebinds RET and DEL, so that indentations can be set and deleted as if they were real tabs.
To enable one of these three mutually exclusive indentation schemes, you just need call one (and only one!) of the turn-on-*
commands while in the buffer you want the indentation scheme to be activated for.
The recommended way is to add one of turn-on-*
commands to haskell-mode-hook
. This can be done either by using M-x customize-variable RET haskell-mode-hook which provides a convenient user interface or by adding one of the following three lines to your .emacs file:
(add-hook 'haskell-mode-hook 'turn-on-haskell-simple-indent) (add-hook 'haskell-mode-hook 'turn-on-haskell-indent) (add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
By inserting the key bindings for C-, and C-. (these bindings are convenient on keyboard layouts where , and . are adjacent keys) as shown below you can interactively de/indent either the following nested block or, if a region is active while in Transient Mark Mode (see (emacs)Disabled Transient Mark), de/indent the active region.
By using a numeric prefix argument (see (elisp)Prefix Command Arguments) you can modify the shift-amount; for instance, C-u C-, increases indentation by 4 characters at once.
(eval-after-load "haskell-mode" '(progn (define-key haskell-mode-map (kbd "C-,") 'haskell-move-nested-left) (define-key haskell-mode-map (kbd "C-.") 'haskell-move-nested-right)))
GNU Emacs provides so-called rectangle commands which operate on rectangular areas of text, which are particularly useful for languages with a layout rule such as Haskell. See (emacs)Rectangles, to learn more about rectangle commands.
Moreover, CUA mode (see (emacs)CUA Bindings) provides enhanced rectangle support with visible rectangle highlighting. When CUA mode is active, you can initiate a rectangle selection by C-RET and extend it simply by movement commands. You don’t have to enable full CUA mode to benefit from these enhanced rectangle commands; you can activate CUA selection mode (without redefining C-x,C-c,C-v, and C-z) by calling M-x cua-selection-mode (or adding (cua-selection-mode nil)
to your haskell-mode-hook
).
Next: Compilation, Previous: Indentation, Up: Top [Index]
haskell-decl-scan-mode
haskell-decl-scan-mode
is a minor mode which performs declaration scanning and provides M-x imenu support (see (emacs)Imenu for more information).
For non-literate and TeX-style literate scripts, the common convention that top-level declarations start at the first column is assumed. For Bird-style literate scripts, the common convention that top-level declarations start at the third column, ie. after ‘> ’, is assumed.
When haskell-decl-scan-mode
is active, the standard Emacs top-level definition movement commands (see (emacs)Moving by Defuns) are enabled to operate on Haskell declarations:
Move to beginning of current or preceding declaration (beginning-of-defun
).
Move to end of current or following declaration (end-of-defun
).
Select whole current or following declaration (mark-defun
).
Moreover, if enabled via the option haskell-decl-scan-add-to-menubar
, a menu item “Declarations” is added to the menu bar listing the scanned declarations and allowing to jump to declarations in the source buffer.
It’s recommended to have font lock mode enabled (see (emacs)Font Lock) as haskell-decl-scan-mode
ignores text highlighted with font-lock-comment-face
.
As usual, in order to activate haskell-decl-scan-mode
automatically for Haskell buffers, add turn-on-haskell-decl-scan
to haskell-mode-hook
:
(add-hook 'haskell-mode-hook 'turn-on-haskell-decl-scan)
haskell-decl-scan-mode
enables the use of features that build upon imenu
support such as Speedbar Frames (see (emacs)Speedbar) or the global “Which Function” minor mode (see (emacs)Which Function).
In order to enable which-function-mode
for Haskell buffers you need to add the following to your Emacs initialization:
(eval-after-load "which-func" '(add-to-list 'which-func-modes 'haskell-mode))
Next: inferior-haskell-mode, Previous: haskell-decl-scan-mode, Up: Top [Index]
Haskell mode comes equipped with a specialized Compilation mode tailored to GHC’s compiler messages with optional support for Cabal projects. See (emacs)Compilation Mode, for more information about the basic commands provided by the Compilation mode which are available in the Haskell compilation sub-mode as well. The additional features provided compared to Emacs’ basic Compilation mode are:
In order to use it, invoke the haskell-compile
command instead of compile
as you would for the ordinary Compilation mode. It’s recommended to bind haskell-compile
to a convenient key binding. For instance, you can add the following to your Emacs initialization to bind haskell-compile
to C-c C-c.
(eval-after-load "haskell-mode" '(define-key haskell-mode-map (kbd "C-c C-c") 'haskell-compile)) (eval-after-load "haskell-cabal" '(define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-compile))
The following description assumes that haskell-compile
has been bound to C-c C-c.
When invoked, haskell-compile
tries to guess how to compile the Haskell program your currently visited buffer belongs to, by searching for a .cabal file in the current of enclosing parent folders. If a .cabal file was found, the command defined in the haskell-compile-cabal-build-command
option is used. Moreover, when requesting to compile a .cabal-file is detected and a negative prefix argument (e.g. C-- C-c C-c) was given, the alternative haskell-compile-cabal-build-command-alt
is invoked. By default, haskell-compile-cabal-build-command-alt
contains a ‘cabal clean -s’ command in order to force a full rebuild.
Otherwise if no .cabal could be found, a single-module compilation is assumed and haskell-compile-command
is used (if the currently visited buffer contains Haskell source code).
You can also inspect and modify the compile command to be invoked temporarily by invoking haskell-compile
with a prefix argument (e.g. C-u C-c C-c). If later-on you want to recompile using the same customized compile command, invoke recompile
(bound to g) inside the ‘*haskell-compilation*’ buffer.
Next: haskell-interactive-mode, Previous: Compilation, Up: Top [Index]
inferior-haskell-mode
The major mode inferior-haskell-mode
provides support for interacting with an inferior Haskell process based on comint-mode
.
By default the haskell-mode-map
keymap is setup to use this mode:
is bound to switch-to-haskell
is bound to switch-to-haskell
is bound to inferior-haskell-load-file
is bound to inferior-haskell-type
is bound to inferior-haskell-info
The Haskell interpreter used by the inferior Haskell mode is auto-detected by default, but is customizable via the haskell-program-name
variable.
Currently, GHCi and Hugs are support as Haskell interpreter.
TODO/WRITEME
Next: haskell-cabal-mode, Previous: inferior-haskell-mode, Up: Top [Index]
haskell-interactive-mode
An alternative mode providing a REPL (read–eval–print loop) via GHCi sessions is called haskell-interactive-mode
, which effectively replaces inferior-haskell-mode
, but comes with a different set of features:
In order to use haskell-interactive-mode
instead of the default inferior-haskell-mode
, you need to replace some of the default keybindings in the haskell-mode-map
keymap with the respective haskell-interactive-mode
counterparts:
(eval-after-load "haskell-mode" '(progn (define-key haskell-mode-map (kbd "C-x C-d") nil) (define-key haskell-mode-map (kbd "C-c C-z") 'haskell-interactive-switch) (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-file) (define-key haskell-mode-map (kbd "C-c C-b") 'haskell-interactive-switch) (define-key haskell-mode-map (kbd "C-c C-t") 'haskell-process-do-type) (define-key haskell-mode-map (kbd "C-c C-i") 'haskell-process-do-info) (define-key haskell-mode-map (kbd "C-c M-.") nil) (define-key haskell-mode-map (kbd "C-c C-d") nil)))
With haskell-interactive-mode
, each Haskell source buffer is associated with at most one GHCi session, so when you call haskell-process-load-file
for a Haskell source buffer which has no session associated yet, you’re asked which GHCi session to create or associate with.
TODO/WRITEME
Next: Concept index, Previous: haskell-interactive-mode, Up: Top [Index]
haskell-cabal-mode
haskell-cabal-mode
is a major mode for editing Cabal package description files and is automatically associated with files having a .cabal extension.
For quickly locating and jumping to the nearest .cabal file from a Haskell source buffer, you can use M-x haskell-cabal-visit-file; with a prefix argument (i.e. C-u) find-file-other-window
is used to visit the .cabal file. If you wish, you can bind haskell-cabal-visit-file
to a convenient key sequence, e.g.
(eval-after-load "haskell-mode" (define-key haskell-mode-map (kbd "C-c v c") 'haskell-cabal-visit-file))
TODO/WRITEME
Next: Function index, Previous: haskell-cabal-mode, Up: Top [Index]
Jump to: | C H I L O R U |
---|
Jump to: | C H I L O R U |
---|
Next: Variable index, Previous: Concept index, Up: Top [Index]
Jump to: | H I L T |
---|
Jump to: | H I L T |
---|
Previous: Function index, Up: Top [Index]
Jump to: | H I |
---|
Jump to: | H I |
---|
for more information about the concept of major modes see (emacs)Major Modes
haskell-mode
is derived from prog-mode
for more information about file associations, see (emacs)Choosing Modes
Haskell also supports braces and semicolons notation for conveying the block structure. However, most Haskell programs written by humans use indentation for block structuring.