comparison .emacs.d/haskell-mode/haskell-mode.tmp.texi @ 0:2764b4f45f9f

1st commit
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Mon, 21 Apr 2014 04:30:59 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:2764b4f45f9f
1 \input texinfo @c -*-texinfo-*-
2 @c %**start of header
3 @setfilename haskell-mode.info
4 @documentencoding UTF-8
5 @settitle Haskell Mode 13.10
6 @c %**end of header
7
8 @dircategory Emacs
9 @direntry
10 * Haskell Mode: (haskell-mode). Haskell Development Environment for Emacs(en)
11 @end direntry
12
13 @copying
14 This manual is for Haskell mode, version 13.10-65-ge9587d9
15
16 Copyright @copyright{} 2013 Haskell Mode contributors.
17
18 @quotation
19 Permission is granted to copy, distribute and/or modify this document under the terms of the @uref{http://www.gnu.org/licenses/fdl.html,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.
20 @end quotation
21 @end copying
22
23 @iftex
24 @titlepage
25 @title Haskell Mode
26 @subtitle Haskell Development Environment for Emacs
27
28 @page
29 @vskip 0pt plus 1filll
30 @insertcopying
31 @end titlepage
32
33 @contents
34 @end iftex
35
36 @ifhtml
37 @titlepage
38 @title Haskell Mode
39 @subtitle Haskell Development Environment for Emacs
40
41 @end titlepage
42 @insertcopying
43 @end ifhtml
44
45 @ifnottex
46 @node Top
47 @top Haskell Mode
48
49 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).
50
51 @end ifnottex
52
53 @menu
54 * Introduction::
55 * Getting Help and Reporting Bugs::
56 * Getting Started::
57 * Editing Haskell Code::
58 * Unicode::
59 * Indentation::
60 * Compilation::
61 * haskell-decl-scan-mode::
62 * inferior-haskell-mode::
63 * haskell-interactive-mode::
64 * haskell-cabal-mode::
65 * Concept index::
66 * Function index::
67 * Variable index::
68
69 @end menu
70
71 @node Introduction
72 @chapter Introduction
73
74 @dfn{Haskell Mode} is a major mode providing a convenient environment for editing @uref{http://www.haskell.org,Haskell} programs.
75
76 Some of its major features are:
77
78 @itemize
79 @item
80 Syntax highlighting (font lock),
81 @item
82 automatic indentation,
83 @item
84 on-the-fly documentation,
85 @item
86 interaction with inferior GHCi/Hugs instance, and
87 @item
88 scanning declarations and placing them in a menu.
89 @end itemize
90
91 @node Getting Help and Reporting Bugs
92 @chapter Getting Help and Reporting Bugs
93
94 This Info manual is work in progress and incomplete. However, you can find more information at these locations in the meantime:
95
96 @itemize
97 @item
98 @uref{https://github.com/haskell/haskell-mode,Haskell Mode's GitHub Home}
99 @item
100 @uref{http://www.haskell.org/haskellwiki/Haskell_mode_for_Emacs,Haskell Wiki Emacs Page}
101 @end itemize
102
103 If you have any questions or like to discuss something regarding Haskell Mode, please consider sending an email to the @uref{http://projects.haskell.org/cgi-bin/mailman/listinfo/haskellmode-emacs, Haskellmode-emacs mailing list}. The mailing list is also available on @uref{http://gmane.org/, Gmane} via the @uref{http://dir.gmane.org/gmane.comp.lang.haskell.emacs, gmane.comp.lang.haskell.emacs} newsgroup.
104
105 If you have discovered a bug or wish to request a new feature, you can @uref{https://github.com/haskell/haskell-mode/issues/new, file a new issue} with Haskell Mode's issue tracker. When filing a bug, please state your currently used software version (@kbd{M-x haskell-version}, @kbd{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 @ref{Top,Emacs Lisp,,elisp} you are welcome to submit patches via @uref{https://help.github.com/articles/using-pull-requests, GitHub Pull Requests}.
106
107 @node Getting Started
108 @chapter Getting Started
109
110 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 @uref{http://marmalade-repo.org/packages/haskell-mode,Marmalade package archive} which contains the latest stable release of Haskell Mode.
111
112 @findex haskell-customize
113 Most of Haskell Mode's settings are configurable via customizable variables (@pxref{Easy Customization,,,emacs}, for details). You can use @kbd{M-x haskell-customize} to browse the @code{haskell} customization sub-tree.
114
115 @vindex haskell-mode-hook
116 One of the important setting you should customize is the @code{haskell-mode-hook} variable (@pxref{Hooks,,,emacs}) which gets run right after the @code{haskell-mode} major mode is initialized for a buffer. You can customize @code{haskell-mode-hook} by @kbd{M-x customize-variable @key{RET} haskell-mode-hook}. It's highly recommended you set up indentation to match your preferences; @xref{Indentation}, for more details about the indentation modes included with Haskell Mode.
117
118 @c TODO:
119 @c provide basic instructions to get up and running with haskell-mode
120 @c tell about the most important commands
121
122 @node Editing Haskell Code
123 @chapter Editing Haskell Code
124
125 @findex haskell-mode
126 @cindex @code{haskell-mode}
127
128 @dfn{Haskell Mode} is actually a collection of so-called major modes@footnote{for more information about the concept of @dfn{major modes} @pxref{Major Modes,,,emacs}} one of which is called @code{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 @code{haskell-mode} written with a dash in-between in a typewriter font is used.
129
130 As one might guess, @code{haskell-mode} is the (programming language@footnote{@code{haskell-mode} is derived from @code{prog-mode}}) major mode for editing (non-literate) Haskell source code. @code{haskell-mode} is associated with the file extensions listed below by default@footnote{for more information about file associations, @pxref{Choosing Modes,,,emacs}}.
131
132 @table @file
133 @item .hs
134 official file extension for (non-literate) Haskell 98/2010 files
135 @item .hsc
136 ``almost-Haskell'' input file for the @uref{http://www.haskell.org/ghc/docs/latest/html/users_guide/hsc2hs.html,hsc2hs} pre-processor
137 @item .cpphs
138 input file for the @uref{http://projects.haskell.org/cpphs/,cpphs} pre-processor
139 @end table
140
141 @cindex literate programming
142 @findex literate-haskell-mode
143
144 @noindent
145 The major mode @code{literate-haskell-mode} (which is derived from @code{haskell-mode} and thus transitively from @code{prog-mode}) provides support for @uref{http://www.haskell.org/haskellwiki/Literate_programming,literate Haskell programs} and is associated with the @file{.lhs} file extension by default.
146
147 @code{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 (@pxref{Mode Line,,,emacs}) as either @samp{LitHaskell/bird} or @samp{LitHaskell/tex}.
148
149 @section Font Lock Support
150
151 @code{haskell-mode} supports @dfn{syntax highlighting} via Emacs' Font Lock minor mode which should be enabled by default in current Emacsen. @xref{Font Lock,,,emacs}, for more information on how to control @code{font-lock-mode}.
152
153 @node Unicode
154 @chapter Unicode support
155
156 @cindex Unicode
157
158 See the Haskell Wiki's entry on @uref{http://www.haskell.org/haskellwiki/Unicode-symbols, Unicode Symbols} for general information about Unicode support in Haskell.
159
160 As Emacs supports editing files containing Unicode out of the box, so does Haskell Mode. As an add-on, Haskell Mode includes the @code{haskell-unicode} input method which allows you to easily type a number of Unicode symbols that are useful when writing Haskell code; @xref{Input Methods,,,emacs}, for more details.
161
162 To automatically enable the @code{haskell-unicode} input method in haskell-mode buffers use @kbd{M-x customize-variable @key{RET} haskell-mode-hook} or put the following code in your @file{.emacs} file:
163
164 @lisp
165 (add-hook 'haskell-mode-hook 'turn-on-haskell-unicode-input-method)
166 @end lisp
167
168 @noindent
169 To temporarily enable this input method for a single buffer you can use @kbd{M-x turn-on-haskell-unicode-input-method}.
170
171 When the @code{haskell-unicode} input method is active, you can simply type @samp{->} and it is immediately replaced with @samp{→}. Use @kbd{C-\} to toggle the input method. To see a table of all key sequences use @kbd{M-x describe-input-method @key{RET} haskell-unicode}. A sequence like @samp{<=} is ambiguous and can mean either @samp{⇐} or @samp{≤}. Typing it presents you with a choice. Type @kbd{1} or @kbd{2} to select an option or keep typing to use the default option.
172
173 If you don't like the highlighting of partially matching tokens you can turn it off by setting @code{input-method-highlight-flag} to @code{nil} via @kbd{M-x customize-variable}.
174
175 @node Indentation
176 @chapter Indentation
177
178 @cindex indentation
179 @cindex layout rule
180 @cindex off-side rule
181
182 For general information about indentation support in GNU Emacs, @pxref{Indentation,,,emacs}.
183
184 In Haskell, code indentation has semantic meaning as it defines the block structure@footnote{Haskell also supports braces and semicolons notation for conveying the block structure. However, most Haskell programs written by humans use indentation for block structuring.}.
185
186 As GNU Emacs' default indentation function (i.e. @code{indent-relative}) is not designed for use with Haskell's layout rule, Haskell mode includes three different indentation minor modes with different trade-offs:
187
188 @ftable @code
189
190 @item turn-on-haskell-simple-indent
191
192 A very simple indentation scheme; In this scheme, @key{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.
193
194 @item turn-on-haskell-indent
195
196 Intelligent semi-automatic indentation for Haskell's layout rule. The basic idea is to have @key{TAB} cycle through possibilities indentation points based on some clever heuristics.
197
198 The rationale and the implementation principles are described in more detail in the article @cite{Dynamic tabbing for automatic indentation with the layout rule} published in the Journal of Functional Programming 8.5 (1998).
199
200 @item turn-on-haskell-indentation
201
202 Improved variation of @code{turn-on-haskell-indent} indentation mode. Rebinds @key{RET} and @key{DEL}, so that indentations can be set and deleted as if they were real tabs.
203
204 @end ftable
205
206 To enable one of these three mutually exclusive indentation schemes, you just need call one (and only one!) of the @code{turn-on-*} commands while in the buffer you want the indentation scheme to be activated for.
207
208 The recommended way is to add one of @code{turn-on-*} commands to @code{haskell-mode-hook}. This can be done either by using @kbd{M-x customize-variable @key{RET} haskell-mode-hook} which provides a convenient user interface or by adding @emph{one} of the following three lines to your @file{.emacs} file:
209
210 @lisp
211 (add-hook 'haskell-mode-hook 'turn-on-haskell-simple-indent)
212 (add-hook 'haskell-mode-hook 'turn-on-haskell-indent)
213 (add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
214 @end lisp
215
216 @section Interactive Block Indentation
217
218 By inserting the key bindings for @kbd{C-,} and @kbd{C-.} (these bindings are convenient on keyboard layouts where @key{,} and @key{.} 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 (@pxref{Disabled Transient Mark,,,emacs}), de/indent the active region.
219
220 By using a numeric prefix argument (@pxref{Prefix Command Arguments,,,elisp}) you can modify the shift-amount; for instance, @kbd{C-u C-,} increases indentation by 4 characters at once.
221
222 @findex haskell-move-nested-left
223 @findex haskell-move-nested-right
224
225 @lisp
226 (eval-after-load "haskell-mode"
227 '(progn
228 (define-key haskell-mode-map (kbd "C-,") 'haskell-move-nested-left)
229 (define-key haskell-mode-map (kbd "C-.") 'haskell-move-nested-right)))
230 @end lisp
231
232 @section Rectangle Commands
233
234 @cindex rectangle
235 @cindex CUA mode
236
237 GNU Emacs provides so-called @dfn{rectangle commands} which operate on rectangular areas of text, which are particularly useful for languages with a layout rule such as Haskell. @xref{Rectangles,,,emacs}, to learn more about rectangle commands.
238
239 Moreover, CUA mode (@pxref{CUA Bindings,,,emacs}) provides enhanced rectangle support with visible rectangle highlighting. When CUA mode is active, you can initiate a rectangle selection by @kbd{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 @kbd{C-x},@kbd{C-c},@kbd{C-v}, and @kbd{C-z}) by calling @kbd{M-x cua-selection-mode} (or adding @code{(cua-selection-mode nil)} to your @code{haskell-mode-hook}).
240
241 @node haskell-decl-scan-mode
242 @chapter @code{haskell-decl-scan-mode}
243
244 @findex turn-on-haskell-decl-scan
245 @findex haskell-decl-scan-mode
246 @vindex haskell-decl-scan-mode-hook
247
248 @code{haskell-decl-scan-mode} is a minor mode which performs declaration scanning and provides @kbd{M-x imenu} support (@pxref{Imenu,,,emacs} for more information).
249
250 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 @samp{> }, is assumed.
251
252 When @code{haskell-decl-scan-mode} is active, the standard Emacs top-level definition movement commands (@pxref{Moving by Defuns,,,emacs}) are enabled to operate on Haskell declarations:
253
254 @table @kbd
255 @item C-M-a
256 Move to beginning of current or preceding declaration (@code{beginning-of-defun}).
257
258 @item C-M-e
259 Move to end of current or following declaration (@code{end-of-defun}).
260
261 @item C-M-h
262 Select whole current or following declaration (@code{mark-defun}).
263 @end table
264
265 Moreover, if enabled via the option @code{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.
266
267 It's recommended to have font lock mode enabled (@pxref{Font Lock,,,emacs}) as @code{haskell-decl-scan-mode} ignores text highlighted with @code{font-lock-comment-face}.
268
269 As usual, in order to activate @code{haskell-decl-scan-mode} automatically for Haskell buffers, add @code{turn-on-haskell-decl-scan} to @code{haskell-mode-hook}:
270
271 @lisp
272 (add-hook 'haskell-mode-hook 'turn-on-haskell-decl-scan)
273 @end lisp
274
275 @code{haskell-decl-scan-mode} enables the use of features that build upon @code{imenu} support such as Speedbar Frames (@pxref{Speedbar,,,emacs}) or the global ``Which Function'' minor mode (@pxref{Which Function,,,emacs}).
276
277 In order to enable @code{which-function-mode} for Haskell buffers you need to add the following to your Emacs initialization:
278
279 @lisp
280 (eval-after-load "which-func"
281 '(add-to-list 'which-func-modes 'haskell-mode))
282 @end lisp
283
284 @node Compilation
285 @chapter Compilation
286
287 @findex haskell-compile
288
289 Haskell mode comes equipped with a specialized @dfn{Compilation mode} tailored to GHC's compiler messages with optional support for Cabal projects. @xref{Compilation Mode,,,emacs}, 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:
290
291 @itemize
292 @item
293 DWIM-style auto-detection of compile command (including support for CABAL projects)
294 @item
295 Support for GHC's compile messages and recognizing error, warning and info source locations (including @option{-ferror-spans} syntax)
296 @item
297 Support for filtering out GHC's uninteresting @samp{Loading package...} linker messages
298 @end itemize
299
300 In order to use it, invoke the @code{haskell-compile} command instead of @code{compile} as you would for the ordinary Compilation mode. It's recommended to bind @code{haskell-compile} to a convenient key binding. For instance, you can add the following to your Emacs initialization to bind @code{haskell-compile} to @kbd{C-c C-c}.
301
302 @lisp
303 (eval-after-load "haskell-mode"
304 '(define-key haskell-mode-map (kbd "C-c C-c") 'haskell-compile))
305
306 (eval-after-load "haskell-cabal"
307 '(define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-compile))
308 @end lisp
309
310 @noindent
311 The following description assumes that @code{haskell-compile} has been bound to @kbd{C-c C-c}.
312
313 @vindex haskell-compile-cabal-build-command
314 @vindex haskell-compile-cabal-build-command-alt
315 @vindex haskell-compile-command
316
317 When invoked, @code{haskell-compile} tries to guess how to compile the Haskell program your currently visited buffer belongs to, by searching for a @file{.cabal} file in the current of enclosing parent folders. If a @file{.cabal} file was found, the command defined in the @code{haskell-compile-cabal-build-command} option is used. Moreover, when requesting to compile a @file{.cabal}-file is detected and a negative prefix argument (e.g. @kbd{C-- C-c C-c}) was given, the alternative @code{haskell-compile-cabal-build-command-alt} is invoked. By default, @code{haskell-compile-cabal-build-command-alt} contains a @samp{cabal clean -s} command in order to force a full rebuild.
318
319 Otherwise if no @file{.cabal} could be found, a single-module compilation is assumed and @code{haskell-compile-command} is used (@emph{if} the currently visited buffer contains Haskell source code).
320
321 You can also inspect and modify the compile command to be invoked temporarily by invoking @code{haskell-compile} with a prefix argument (e.g. @kbd{C-u C-c C-c}). If later-on you want to recompile using the same customized compile command, invoke @code{recompile} (bound to @kbd{g}) inside the @samp{*haskell-compilation*} buffer.
322
323 @node inferior-haskell-mode
324 @chapter @code{inferior-haskell-mode}
325
326 @findex inferior-haskell-find-definition
327 @findex inferior-haskell-find-haddock
328 @findex inferior-haskell-info
329 @findex inferior-haskell-load-and-run
330 @findex inferior-haskell-load-file
331 @findex inferior-haskell-mode
332 @findex inferior-haskell-reload-file
333 @findex inferior-haskell-start-process
334 @findex inferior-haskell-type
335 @vindex haskell-program-name
336 @vindex inferior-haskell-mode-hook
337
338 The major mode @code{inferior-haskell-mode} provides support for interacting with an inferior Haskell process based on @code{comint-mode}.
339
340 By default the @code{haskell-mode-map} keymap is setup to use this mode:
341
342 @table @kbd
343 @item C-c C-z
344 is bound to @code{switch-to-haskell}
345 @item C-c C-b
346 is bound to @code{switch-to-haskell}
347 @item C-c C-l
348 is bound to @code{inferior-haskell-load-file}
349 @item C-c C-t
350 is bound to @code{inferior-haskell-type}
351 @item C-c C-i
352 is bound to @code{inferior-haskell-info}
353 @end table
354
355 The Haskell interpreter used by the inferior Haskell mode is auto-detected by default, but is customizable via the @code{haskell-program-name} variable.
356
357 Currently, GHCi and Hugs are support as Haskell interpreter.
358
359 TODO/WRITEME
360 @c write about supported features
361
362 @node haskell-interactive-mode
363 @chapter @code{haskell-interactive-mode}
364
365 An alternative mode providing a @acronym{REPL,read–eval–print loop} via GHCi sessions is called @code{haskell-interactive-mode}, which effectively replaces @code{inferior-haskell-mode}, but comes with a different set of features:
366
367 @itemize
368 @item
369 Separate sessions per Cabal project @file{haskell-session.el}.
370 @item
371 A new inferior Haskell process handling code @file{haskell-process.el}.
372 @item
373 New REPL implementation similiar to SLIME/IELM @file{haskell-interactive-mode.el}.
374 @end itemize
375
376 In order to use @code{haskell-interactive-mode} instead of the default @code{inferior-haskell-mode}, you need to replace some of the default keybindings in the @code{haskell-mode-map} keymap with the respective @code{haskell-interactive-mode} counterparts:
377
378 @lisp
379 (eval-after-load "haskell-mode"
380 '(progn
381 (define-key haskell-mode-map (kbd "C-x C-d") nil)
382 (define-key haskell-mode-map (kbd "C-c C-z") 'haskell-interactive-switch)
383 (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-file)
384 (define-key haskell-mode-map (kbd "C-c C-b") 'haskell-interactive-switch)
385 (define-key haskell-mode-map (kbd "C-c C-t") 'haskell-process-do-type)
386 (define-key haskell-mode-map (kbd "C-c C-i") 'haskell-process-do-info)
387 (define-key haskell-mode-map (kbd "C-c M-.") nil)
388 (define-key haskell-mode-map (kbd "C-c C-d") nil)))
389 @end lisp
390
391 With @code{haskell-interactive-mode}, each Haskell source buffer is associated with at most one GHCi session, so when you call @code{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.
392
393 TODO/WRITEME
394
395 @node haskell-cabal-mode
396 @chapter @code{haskell-cabal-mode}
397
398 @findex haskell-cabal-mode
399 @vindex haskell-cabal-mode-hook
400
401 @code{haskell-cabal-mode} is a major mode for editing @uref{http://www.haskell.org/cabal/users-guide/developing-packages.html,Cabal package description files} and is automatically associated with files having a @file{.cabal} extension.
402
403 @findex haskell-cabal-visit-file
404
405 For quickly locating and jumping to the nearest @file{.cabal} file from a Haskell source buffer, you can use @kbd{M-x haskell-cabal-visit-file}; with a prefix argument (i.e. @kbd{C-u}) @code{find-file-other-window} is used to visit the @file{.cabal} file. If you wish, you can bind @code{haskell-cabal-visit-file} to a convenient key sequence, e.g.
406
407 @lisp
408 (eval-after-load "haskell-mode"
409 (define-key haskell-mode-map (kbd "C-c v c") 'haskell-cabal-visit-file))
410 @end lisp
411
412 TODO/WRITEME
413
414 @node Concept index
415 @unnumbered Concept index
416
417 @printindex cp
418
419 @node Function index
420 @unnumbered Function index
421
422 @printindex fn
423
424 @node Variable index
425 @unnumbered Variable index
426
427 @printindex vr
428
429 @bye
430
431 @c Local Variables:
432 @c eval: (visual-line-mode t)
433 @c eval: (linum-mode t)
434 @c eval: (hl-line-mode t)
435 @c End: