|
|
|
|
This is haskell-mode.info, produced by makeinfo version 5.2 from
|
|
|
|
|
haskell-mode.texi.
|
|
|
|
|
|
|
|
|
|
This manual is for Haskell mode, version 13.15-git
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
(http://www.gnu.org/licenses/fdl.html), 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.
|
|
|
|
|
INFO-DIR-SECTION Emacs
|
|
|
|
|
START-INFO-DIR-ENTRY
|
|
|
|
|
* Haskell Mode: (haskell-mode). Haskell Development Environment for Emacs(en)
|
|
|
|
|
END-INFO-DIR-ENTRY
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Top, Next: Introduction, Up: (dir)
|
|
|
|
|
|
|
|
|
|
Haskell Mode
|
|
|
|
|
************
|
|
|
|
|
|
|
|
|
|
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).
|
|
|
|
|
|
|
|
|
|
* Menu:
|
|
|
|
|
|
|
|
|
|
* Introduction:: An introduction to Haskell Mode
|
|
|
|
|
* Getting Help and Reporting Bugs:: How to improve Haskell Mode
|
|
|
|
|
* Getting Started:: How to get started
|
|
|
|
|
* Editing Haskell Code:: How to edit code
|
|
|
|
|
* Unicode support:: How to use Unicode
|
|
|
|
|
* Indentation:: Notes about indentation
|
|
|
|
|
* Declaration scanning:: How to navigate in a source file
|
|
|
|
|
* Compilation:: How to compile
|
|
|
|
|
* Inferior Haskell interpreter:: How to interact with GHCi (1)
|
|
|
|
|
* Interactive Haskell:: How to interact with GHCi (2)
|
|
|
|
|
* Editing Cabal files:: Cabal support
|
|
|
|
|
* Changing REPL target:: Start REPL with selected target (i.e. test,bench,etc.)
|
|
|
|
|
* Concept index:: Index of Haskell Mode concepts
|
|
|
|
|
* Function index:: index of commands
|
|
|
|
|
* Variable index:: Index of options and types
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Introduction, Next: Getting Help and Reporting Bugs, Prev: Top, Up: Top
|
|
|
|
|
|
|
|
|
|
1 Introduction
|
|
|
|
|
**************
|
|
|
|
|
|
|
|
|
|
"Haskell Mode" is a major mode providing a convenient environment for
|
|
|
|
|
editing Haskell (http://www.haskell.org) programs.
|
|
|
|
|
|
|
|
|
|
Some of its major features are:
|
|
|
|
|
|
|
|
|
|
• Syntax highlighting (font lock),
|
|
|
|
|
• automatic indentation,
|
|
|
|
|
• on-the-fly documentation,
|
|
|
|
|
• interaction with inferior GHCi/Hugs instance, and
|
|
|
|
|
• scanning declarations and placing them in a menu.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Getting Help and Reporting Bugs, Next: Getting Started, Prev: Introduction, Up: Top
|
|
|
|
|
|
|
|
|
|
2 Getting Help and Reporting Bugs
|
|
|
|
|
*********************************
|
|
|
|
|
|
|
|
|
|
This Info manual is work in progress and incomplete. However, you can
|
|
|
|
|
find more information at these locations in the meantime:
|
|
|
|
|
|
|
|
|
|
• Haskell Mode’s GitHub Home
|
|
|
|
|
(https://github.com/haskell/haskell-mode)
|
|
|
|
|
• Haskell Wiki Emacs Page
|
|
|
|
|
(http://www.haskell.org/haskellwiki/Haskell_mode_for_Emacs)
|
|
|
|
|
|
|
|
|
|
If you have any questions or like to discuss something regarding
|
|
|
|
|
Haskell Mode, please consider sending an email to the Haskellmode-emacs
|
|
|
|
|
mailing list
|
|
|
|
|
(http://projects.haskell.org/cgi-bin/mailman/listinfo/haskellmode-emacs).
|
|
|
|
|
The mailing list is also available on Gmane (http://gmane.org/) via the
|
|
|
|
|
gmane.comp.lang.haskell.emacs
|
|
|
|
|
(http://dir.gmane.org/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
|
|
|
|
|
(https://github.com/haskell/haskell-mode/issues/new) 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 *note Emacs Lisp: (elisp)Top. you are
|
|
|
|
|
welcome to submit patches via GitHub Pull Requests
|
|
|
|
|
(https://help.github.com/articles/using-pull-requests).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Getting Started, Next: Editing Haskell Code, Prev: Getting Help and Reporting Bugs, Up: Top
|
|
|
|
|
|
|
|
|
|
3 Getting Started
|
|
|
|
|
*****************
|
|
|
|
|
|
|
|
|
|
If you are reading this, you have most likely already managed to install
|
|
|
|
|
Haskell Mode in one way or another.
|
|
|
|
|
|
|
|
|
|
Most of Haskell Mode’s settings are configurable via customizable
|
|
|
|
|
variables (*note (emacs)Easy Customization::, for details). You can use
|
|
|
|
|
|
|
|
|
|
‘M-x customize-group <RET> haskell’ to browse the ‘haskell’
|
|
|
|
|
customization sub-tree.
|
|
|
|
|
|
|
|
|
|
One of the important setting you should customize is the
|
|
|
|
|
‘haskell-mode-hook’ variable (*note (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; *Note Indentation::, for more details about the
|
|
|
|
|
indentation modes included with Haskell Mode.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Editing Haskell Code, Next: Unicode support, Prev: Getting Started, Up: Top
|
|
|
|
|
|
|
|
|
|
4 Editing Haskell Code
|
|
|
|
|
**********************
|
|
|
|
|
|
|
|
|
|
"Haskell Mode" is actually a collection of so-called major modes(1) 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 language(2))
|
|
|
|
|
major mode for editing (non-literate) Haskell source code.
|
|
|
|
|
‘haskell-mode’ is associated with the file extensions listed below by
|
|
|
|
|
default(3).
|
|
|
|
|
|
|
|
|
|
‘.hs’
|
|
|
|
|
official file extension for (non-literate) Haskell 98/2010 files
|
|
|
|
|
‘.hsc’
|
|
|
|
|
“almost-Haskell” input file for the hsc2hs
|
|
|
|
|
(http://www.haskell.org/ghc/docs/latest/html/users_guide/hsc2hs.html)
|
|
|
|
|
pre-processor
|
|
|
|
|
‘.cpphs’
|
|
|
|
|
input file for the cpphs (http://projects.haskell.org/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
|
|
|
|
|
(http://www.haskell.org/haskellwiki/Literate_programming) 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 (*note (emacs)Mode Line::) as either
|
|
|
|
|
‘LitHaskell/bird’ or ‘LitHaskell/tex’.
|
|
|
|
|
|
|
|
|
|
4.1 Font Lock Support
|
|
|
|
|
=====================
|
|
|
|
|
|
|
|
|
|
‘haskell-mode’ supports "syntax highlighting" via Emacs’ Font Lock minor
|
|
|
|
|
mode which should be enabled by default in current Emacsen. *Note
|
|
|
|
|
(emacs)Font Lock::, for more information on how to control
|
|
|
|
|
‘font-lock-mode’.
|
|
|
|
|
|
|
|
|
|
4.2 Completion support
|
|
|
|
|
======================
|
|
|
|
|
|
|
|
|
|
‘haskell-mode’ can complete symbols, pragma directives and language
|
|
|
|
|
extensions. This is part of ‘haskell-interactive-mode’.
|
|
|
|
|
|
|
|
|
|
If haskell-interactive-mode is enabled and working haskell mode
|
|
|
|
|
provides completions for import statements taking into account currently
|
|
|
|
|
loaded and available packages.
|
|
|
|
|
|
|
|
|
|
---------- Footnotes ----------
|
|
|
|
|
|
|
|
|
|
(1) for more information about the concept of "major modes" *note
|
|
|
|
|
(emacs)Major Modes::
|
|
|
|
|
|
|
|
|
|
(2) ‘haskell-mode’ is derived from ‘prog-mode’
|
|
|
|
|
|
|
|
|
|
(3) for more information about file associations, *note
|
|
|
|
|
(emacs)Choosing Modes::
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Unicode support, Next: Indentation, Prev: Editing Haskell Code, Up: Top
|
|
|
|
|
|
|
|
|
|
5 Unicode support
|
|
|
|
|
*****************
|
|
|
|
|
|
|
|
|
|
See the Haskell Wiki’s entry on Unicode Symbols
|
|
|
|
|
(http://www.haskell.org/haskellwiki/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; *Note
|
|
|
|
|
(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’.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Indentation, Next: Declaration scanning, Prev: Unicode support, Up: Top
|
|
|
|
|
|
|
|
|
|
6 Indentation
|
|
|
|
|
*************
|
|
|
|
|
|
|
|
|
|
For general information about indentation support in GNU Emacs, *note
|
|
|
|
|
(emacs)Indentation::.
|
|
|
|
|
|
|
|
|
|
In Haskell, code indentation has semantic meaning as it defines the
|
|
|
|
|
block structure(1).
|
|
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
‘haskell-simple-indent-mode’
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
‘haskell-indent-mode’
|
|
|
|
|
|
|
|
|
|
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).
|
|
|
|
|
|
|
|
|
|
‘haskell-indentation-mode’
|
|
|
|
|
|
|
|
|
|
Improved variation of ‘haskell-indent-mode’ 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 ‘*-mode’ commands while
|
|
|
|
|
in the buffer you want the indentation scheme to be activated for.
|
|
|
|
|
|
|
|
|
|
The recommended way is to add one of ‘*-mode’ 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 'haskell-simple-indent-mode)
|
|
|
|
|
(add-hook 'haskell-mode-hook 'haskell-indent-mode)
|
|
|
|
|
(add-hook 'haskell-mode-hook 'haskell-indentation-mode)
|
|
|
|
|
|
|
|
|
|
6.1 Interactive Block 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 (*note
|
|
|
|
|
(emacs)Disabled Transient Mark::), de/indent the active region.
|
|
|
|
|
|
|
|
|
|
By using a numeric prefix argument (*note (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)))
|
|
|
|
|
|
|
|
|
|
6.2 Rectangle Commands
|
|
|
|
|
======================
|
|
|
|
|
|
|
|
|
|
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. *Note (emacs)Rectangles::, to learn
|
|
|
|
|
more about rectangle commands.
|
|
|
|
|
|
|
|
|
|
Moreover, CUA mode (*note (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’).
|
|
|
|
|
|
|
|
|
|
---------- Footnotes ----------
|
|
|
|
|
|
|
|
|
|
(1) Haskell also supports braces and semicolons notation for
|
|
|
|
|
conveying the block structure. However, most Haskell programs written
|
|
|
|
|
by humans use indentation for block structuring.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Declaration scanning, Next: Compilation, Prev: Indentation, Up: Top
|
|
|
|
|
|
|
|
|
|
7 Declaration scannning
|
|
|
|
|
***********************
|
|
|
|
|
|
|
|
|
|
‘haskell-decl-scan-mode’ is a minor mode which performs declaration
|
|
|
|
|
scanning and provides ‘M-x imenu’ support (*note (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 (*note (emacs)Moving by Defuns::) are
|
|
|
|
|
enabled to operate on Haskell declarations:
|
|
|
|
|
|
|
|
|
|
‘C-M-a’
|
|
|
|
|
Move to beginning of current or preceding declaration
|
|
|
|
|
(‘beginning-of-defun’).
|
|
|
|
|
|
|
|
|
|
‘C-M-e’
|
|
|
|
|
Move to end of current or following declaration (‘end-of-defun’).
|
|
|
|
|
|
|
|
|
|
‘C-M-h’
|
|
|
|
|
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 (*note (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 ‘haskell-decl-scan-mode’ to
|
|
|
|
|
‘haskell-mode-hook’:
|
|
|
|
|
|
|
|
|
|
(add-hook 'haskell-mode-hook 'haskell-decl-scan-mode)
|
|
|
|
|
|
|
|
|
|
‘haskell-decl-scan-mode’ enables the use of features that build upon
|
|
|
|
|
‘imenu’ support such as Speedbar Frames (*note (emacs)Speedbar::) or the
|
|
|
|
|
global “Which Function” minor mode (*note (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))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Compilation, Next: Inferior Haskell interpreter, Prev: Declaration scanning, Up: Top
|
|
|
|
|
|
|
|
|
|
8 Compilation
|
|
|
|
|
*************
|
|
|
|
|
|
|
|
|
|
Haskell mode comes equipped with a specialized "Compilation mode"
|
|
|
|
|
tailored to GHC’s compiler messages with optional support for Cabal
|
|
|
|
|
projects. *Note (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:
|
|
|
|
|
|
|
|
|
|
• DWIM-style auto-detection of compile command (including support for
|
|
|
|
|
CABAL projects)
|
|
|
|
|
• Support for GHC’s compile messages and recognizing error, warning
|
|
|
|
|
and info source locations (including ‘-ferror-spans’ syntax)
|
|
|
|
|
• Support for filtering out GHC’s uninteresting ‘Loading package...’
|
|
|
|
|
linker messages
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Inferior Haskell interpreter, Next: Interactive Haskell, Prev: Compilation, Up: Top
|
|
|
|
|
|
|
|
|
|
9 Inferior Haskell interpreter
|
|
|
|
|
******************************
|
|
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
‘C-c C-z’
|
|
|
|
|
is bound to ‘switch-to-haskell’
|
|
|
|
|
‘C-c C-b’
|
|
|
|
|
is bound to ‘switch-to-haskell’
|
|
|
|
|
‘C-c C-l’
|
|
|
|
|
is bound to ‘inferior-haskell-load-file’
|
|
|
|
|
‘C-c C-t’
|
|
|
|
|
is bound to ‘inferior-haskell-type’
|
|
|
|
|
‘C-c C-i’
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Interactive Haskell, Next: Editing Cabal files, Prev: Inferior Haskell interpreter, Up: Top
|
|
|
|
|
|
|
|
|
|
10 Interactive Haskell
|
|
|
|
|
**********************
|
|
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
• Separate sessions per Cabal project ‘haskell-session.el’.
|
|
|
|
|
• A new inferior Haskell process handling code ‘haskell-process.el’.
|
|
|
|
|
• New REPL implementation similiar to SLIME/IELM
|
|
|
|
|
• Navigatable error overlays ‘haskell-interactive-mode.el’.
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Editing Cabal files, Next: Changing REPL target, Prev: Interactive Haskell, Up: Top
|
|
|
|
|
|
|
|
|
|
11 Editing Cabal files
|
|
|
|
|
**********************
|
|
|
|
|
|
|
|
|
|
‘haskell-cabal-mode’ is a major mode for editing Cabal package
|
|
|
|
|
description files
|
|
|
|
|
(http://www.haskell.org/cabal/users-guide/developing-packages.html) 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Changing REPL target, Next: Concept index, Prev: Editing Cabal files, Up: Top
|
|
|
|
|
|
|
|
|
|
12 Changing REPL target
|
|
|
|
|
***********************
|
|
|
|
|
|
|
|
|
|
With ‘haskell-session-change-target’ you can change the target for REPL
|
|
|
|
|
session.
|
|
|
|
|
|
|
|
|
|
After REPL session started, in ‘haskell-interactive-mode’ buffer
|
|
|
|
|
invoke the ‘haskell-session-change-target’ and select from available
|
|
|
|
|
targets for
|
|
|
|
|
|
|
|
|
|
- Testing
|
|
|
|
|
|
|
|
|
|
- Benchmark
|
|
|
|
|
|
|
|
|
|
- Executable
|
|
|
|
|
|
|
|
|
|
- Library
|
|
|
|
|
|
|
|
|
|
Answer “yes” to restart the session and run your tests, benchmarks,
|
|
|
|
|
executables.
|
|
|
|
|
|
|
|
|
|
TODO/WRITEME
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: haskell-mode.info, Node: Concept index, Next: Function index, Prev: Changing REPL target, Up: Top
|
|
|
|
|
|
|
|
|
|
Concept index
|
|
|
|
|
*************
|
|
|
|
|
|
|
|
|
|
|