05 Aug 2015

Practical Haskell - Editor Setup with Stack

In Getting Started with Stack we showed you how to install GHC and stack, set up a project, and write a little code.

We can use GHCI without editor integration for a pretty good workflow, but configuring your text editor to underline errors can be very helpful. This article will show you how to get it all working with stack.

The bleeding edge

There are two main editor plugins: ghc-mod and hdevtools. ghc-mod is great, but at the time of this writing they don’t support stack, so we can’t use them with the project setup we introduced in Getting Started. But hdevtools works great!

Update: ghc-mod has been updated to work with stack. For atom users, I’d now recommend using ide-haskell, which should have instructions to install all dependencies. Then refer to this article: Using ghc-mod with stack. Basically you install ghc-mod locally for each project:

cd my-project
stack install ghc-mod

Installing GHC and Hdevtools globally

Normally, we want to use stack in a project folder with a stack.yaml file and a .cabal file so we can install specific dependencies to each project. But our text editor runs globally, so we need to install hdevtools globally instead.

First, head into a global folder that isn’t a haskell project and run stack setup. This will install ghc for you.

$ cd ~
$ stack setup
Run from outside a project, using implicit global config
Using resolver: lts-3.1 from global config file: /Users/seanhess/.stack/global/stack.yaml
stack will use a locally installed GHC
For more information on paths, see 'stack path' and 'stack exec env'
To use this GHC and packages outside of a project, consider using:
stack ghc, stack ghci, stack runghc, or stack exec

Then install hdevtools

$ stack install hdevtools
Run from outside a project, using implicit global config
Using resolver: lts-3.1 from global config file: /Users/seanhess/.stack/global/stack.yaml
NOTE: the install command is functionally equivalent to 'build --copy-bins'
syb-0.5.1: download
...
Completed all 5 actions.
Copying from /Users/seanhess/.stack/snapshots/x86_64-osx/lts-3.1/7.10.2/bin/hdevtools to /Users/seanhess/.local/bin/hdevtools

Copied executables to /Users/seanhess/.local/bin/:
- hdevtools

Adding it to your PATH

We need both hdevtools and ghc to be available on our PATH environment variable for it to work with our text editor. We can use stack path to have stack tell us where it puts binaries:

$ cd ~
$ stack path
Run from outside a project, using implicit global config
Using resolver: lts-3.1 from global config file: /Users/seanhess/.stack/global/stack.yaml
global-stack-root: /Users/seanhess/.stack
...
ghc-paths: /Users/seanhess/.stack/programs/x86_64-osx
local-bin-path: /Users/seanhess/.local/bin
...

ghc is located in a folder under GHC-PATHS/ghc-VERSION/bin, like this on my system:

~/.stack/programs/x86_64-osx/ghc-7.10.2/bin/ghc

hdevtools is located in the local-bin-path folder:

~/.local/bin

Let’s add both to our PATH. On OSX, open ~/.bash_profile and add something like this:

export PATH=~/.stack/programs/x86_64-osx/ghc-7.10.2/bin/ghc:~/.local/bin:$PATH

Testing to see if it works

Let’s open new terminal window to get our PATH to reload and type the following:

$ hdevtools --version
hdevtools: version 0.1.2.1 (ghc-7.10.2-x86_64-darwin, cabal-1.22.4.0)

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.10.2

Now let’s make sure hdevtools works in our project. Go to a haskell project and use the hdevtools check command. This is what your editor will be doing behind the scenes.

$ cd ~/my-haskell-project
$ hdevtools check src/Main.hs

Getting a Text Editor Plugin

Now that hdevtools is working on the command-line we can install an editor plugin. The hdevtools homepage has a list of available editor plugins, including Vim, Emacs, and Atom. Follow the instructions to get set up!

You should be able to get errors highlighting on save, and see what the type is for different parts of code. Here’s what it looks like in my editor as I edit code and hit save.

Limitations

Hdevtools doesn’t provide any autocomplete information.

You can’t use Atom’s Haskell-IDE until ghc-mod gets up to speed. The error highlighting provided by the other plugins are the most useful feature though.

GHC-mod now supports stack. Refer to the instructions at the beginning of the article for atom users.

Assignment

Play around with the various features your editor provides on the project you created in Getting Started

Next

Next up, let’s learn how to import code

Licensed under Creative Commons Attribution-ShareAlike 4.0