---
title: Using GHC IDE for Haskell Error Checking and Autocompletion
date: 2020-01-06T17:07:25-08:00
tags: ["Haskell", "Language Server Protocol"]
---

Last year, when I took Oregon State University's CS 381 class, I ended up setting
up my editor with the Haskell IDE engine. This made it possible
to detect errors, view types, and have good autocompletion within the editor itself.
Recently, I've found that GHC IDE works better for my projects, so instead
of butchering the original article, I'll just quickly write an updated version here,
referencing the old one when necessary.

By the end of the article, your editor should be able to detect errors and
properly autocomplete Haskell code, somewhat like in the below screenshot:

![Imgur](https://i.imgur.com/CRMznGL.png)

### Downloading and Installing GHC IDE
GHC IDE is a Haskell-based program that uses the
{{< sidenote "right" "lsp-note" "language server protocol" >}}
You don't really need to know what the language server protocol (LSP) is
to use GHC IDE. If you are nonetheless interested, I wrote a little
bit about it <a href="{{< ref "/blog/haskell_language_server" >}}#prelude-language-server-protocol">in the previous iteration of this post.</a>
If you want more information, check out the <a href="https://microsoft.github.io/language-server-protocol/">official Microsoft page on LSP.</a>
{{< /sidenote >}} to communicate with any editor that supports it. Editors
with support the the LSP include Atom, Visual Studio Code, Emacs, and Vim. Thus,
You can get a good Haskell development environment without tying yourself to one
application or service.

We first want to download the GHC IDE. To do this, you need to have
[Git](https://git-scm.com/) installed. Once you have that, in your Git bash (on Windows)
or in your terminal (maxOS, Linux), type the command:

```
git clone https://github.com/digital-asset/ghcide.git
```

To install GHC IDE, you can use either `cabal` (which is typically the `cabal-install` package,
and is required normally for this class) or `stack` (a build tool). For `cabal`:

```
cabal install
```

And for `stack`:

```
stack install
```

This will create an executable in your `~/.local/bin` directory. By default, this
is not usable from other programs, such as Vim, so you should add this directory
to your path. On Linux and macOS, this is done by adding the following line
to your `.bashrc` file (or equivalent):

```
export PATH=$PATH:/home/<yourusername>/.local/bin
```

On Windows, this is done by
{{< sidenote "right" "path-note" "editing your PATH variable." >}}
If you need to know how to change your <code>PATH</code>, I wrote
about it briefly in the <a href="{{< ref "/blog/haskell_language_server" >}}
#installation-of-v0-5-0-0-windows-systems">previous iteration of this post.</a>
{{< /sidenote >}} I don't run Windows,
so I don't know where `cabal install` will place the executable, but I do know
where the executable will appear if you use `stack install` - in the directory
given by:

```
stack path --local-bin
```

Adding that to your path should be sufficient to use GHC IDE.

### Setting up Your Editor
This is where the paths diverge. I personally use (Neo)vim, but for the sake
of completeness, I'll go over installation for Atom and VSCode (I'm not including
Emacs because I know nothing about configuring Emacs).

#### Atom
There appears to be an Atom extension specifically for GHC IDE:
[ide-haskell-ghcide](https://atom.io/packages/ide-haskell-ghcide). It doesn't
have a lot of configuration options, and will certainly require GHC IDE to
be in your path. However, since both GHC IDE and the Haskell IDE engine
use the Language Server Protocol, the more mature [ide-haskell-hie](https://atom.io/packages/ide-haskell-hie) extension may work, as well. In fact, since `ide-haskell-ghcide` is so young,
I'd recommend trying `ide-haskell-hie` first, configuring the settings (found under
_Settings > Packages > (Search ide-haskell-hie) > Settings_)
to use the following full path:

```
<output of stack path --local-bin>/ghcide
```

#### VSCode
The team behind GHC IDE maintains an official VSCode extension found
[here](https://marketplace.visualstudio.com/items?itemName=DigitalAssetHoldingsLLC.ghcide).
Installing it, when you have GHC IDE also installed, should be sufficient to get
VSCode to autocomplete and error check.

#### (Neo)vim
My original recommendations for (neo)vim remain unchanged, with the exception
of using `ghcide` instead of `hie` in the `serverCommands` variable. You
can find the original instructions
[here](https://danilafe.com/blog/haskell_language_server/#neovim).

### Conclusion
I hope that using GHC IDE, you'll be able to have a significantly more pleasant
Haskell experience in CS 381. Enjoy!
