HaRe : The Haskell Refactorer
Note: The current version (0.7.2.8) does not install with GHC 7.8.x
The token management utilities haskell-token-utils are too brittle, and will not be updated for GHC 7.8.x and beyond.
There are substantial changes coming in GHC 7.10, which will form the basis of the new token management, based on ghc-exactprint
For coming changes in GHC 7.10, see
cabal install HaRe
Check that it works from the command line
$ ghc-hare --version 0.7.2.x
Running the bare command lists available refactorings and their parameters
Currently only emacs integration is offered. Add the following to your ~/.emacs using the load-path entry that matches the installation on your machine.
(add-to-list 'load-path "~/.cabal/share/HaRe-0.7.2.2/elisp") (add-to-list 'load-path "~/.cabal/share/i386-linux-ghc-7.6.3/HaRe-0.7.2.2/elisp") (require 'hare) (autoload 'hare-init "hare" nil t)
Add an intializer hook to the ghc-mode command
(add-hook 'haskell-mode-hook (lambda () (ghc-init) (hare-init)))
Alternatively, if using haskell-mode, and initializing via a function
;; Haskell main editing mode key bindings. (defun haskell-hook () ;(lambda nil (ghc-init)) (ghc-init) (hare-init) ... )
If this is done correctly, there should be an additional
menu entry when opening a haskell file. The refactorings can be
initiated via the menu, or using the keyboard shortcuts displayed in
The installation can be fine-tuned using
Each refactoring will first ask for any information it requires, e.g. a new name if renaming, and then attempt the refactoring. If any precondition is not met this will be reported and the refactoring will abort.
If it succeeds, you will be given the option to look at an ediff session to see what changes would be made, and each file can be individually accepted or declined.
If the refactoring is commited, the original file is renamed to have a suffix containing the current timestamp.
E.g., after renaming in Foo.hs, there will be two files
This allows a sequence of refactorings to be undone manually if required. In theory.
Development & Support
Join in at
#haskell-refactorer on freenode.
Developing in sandbox with haskell-token-utils locally
cabal clean cabal sandbox init # Next line assumes haskell-token-utils checked out at same level cabal sandbox add-source ../haskell-token-utils/ cabal install --dependencies-only
Running test suite
To run the test suite do:
cabal configure --enable-tests && cabal build && cabal test
See http://hspec.github.com/ for details on hspec
see http://travis-ci.org/#alanz/HaRe for continuous build results
- GHC chapter of AOSA (if only for the diagram of GHC phases and data structures)
- GHC 7.6.3 API docs
- GHC 7.4.2 API docs
- Monoids: Theme and Variations The background to how the dual tree data structure used for token output works
Contributors: please try to follow https://github.com/tibbe/haskell-style-guide Note:A consistent coding layout style is more important than what specific on is used.
- Simon Thompson
- Christopher Brown
- Huiqing Li
- Alan Zimmerman
Please put a pull request for this list if you are missing.
The logo was designed by Christi du Toit, http://www.behance.net/christidutoit