Either “GHCi as a daemon” or “GHC + a bit of an IDE”. To a first approximation, it opens
ghci and runs
:reload whenever your source code changes, formatting the output to fit a fixed height console. Unlike other Haskell development tools,
ghcid is intended to be incredibly simple. In particular, it doesn’t integrate with any editors, doesn’t depend on GHC the library and doesn’t start web servers.
Acknowledgements: This project incorporates significant work from JPMoresmau, who is listed as a co-author.
cabal update && cabal install ghcid to install it as normal. Then run
ghcid --height=8 --topmost "--command=ghci Main.hs". The
height is the number of lines you are going to resize your console window to (defaults to height of the console). The
topmost is to make the window sit above all others, which only works on Windows. The
command is how you start your project in
ghci. If you omit
--command then it will default to
ghci if you have a
.ghci file in the current directory, otherwise it will default to
Personally, I always create a
.ghci file at the root of all my projects, which usually reads something like:
:set -fwarn-unused-binds -fwarn-unused-imports :set -isrc :load Main
After that, resize your console and make it so you can see it while working in your editor. On Windows the console will automatically sit on top of all other windows. On Linux, you probably want to use your window manager to make it topmost or use a tiling window manager.
What you get
On every save you’ll see a list of the errors and warnings in your project. It uses
ghci under the hood, so even relatively large projects should update their status pretty quickly. As an example:
Main.hs:23:10: Not in scope: `verbosit' Perhaps you meant `verbosity' (imported from System.Console.CmdArgs) Util.hs:18:1: Warning: Defined but not used: `foo'
Or, if everything is good, you see:
Please report any bugs you find.
- This isn’t as good as full IDE. I’ve gone for simplicity over features. It’s a point in the design space, but not necessarily the best point in the design space for you. For “real” IDEs see the Haskell wiki.
- If I delete a file and put it back it gets stuck. Yes, that’s a bug in GHCi. If you see GHCi getting confused just kill
ghcidand start it again.
#24, don't error out if error/putStrLn are not imported
#19, put errors in bold
#9, display interesting information in the title bar
#7, reload if the .ghci or .cabal file changes
#21, if you aren't waiting for any files, exit
#21, if the root file is missing, report an error
#20, avoid an O(n^2) nub
#18, reformat excessively long lines, add a --width flag
Ensure if there are lots of warnings, the first error gets shown
#11, ignore certain GHCi-only warnings
#13, fix version printing
#8, display Loading... when starting
Require the extra library
#14, figure out the terminal height automatically
#6, rewrite as a library
Remove duplicate error messages from cabal repl
#2, handle files that get deleted while loaded
#3, flesh out the test suite
#4, give a polite error if ghci does not start
#5, add --topmost flag to make the window topmost
Add a very simple test suite
Default to cabal repl if there is no .ghci file
#1, if there is an IOError just :reload
Say why you are reloading
Support arguments to --command