Skip to content


Repository files navigation


Emacs integration for psc-ide


The package is available on MELPA. Please read the MELPA’s Getting Started guide for more information. Once you have MELPA configured install psc-ide-emacs via package.el:

M-x package-install RET psc-ide RET


Add the following to your ~/.emacs:

(require 'psc-ide)

(add-hook 'purescript-mode-hook
  (lambda ()

If you want to use the psc-ide server that is relative to your npm bin directory, e.g. ./node_modules/.bin/purs, add this line to your config:

(setq psc-ide-use-npm-bin t)

If you would like to use a custom codegen target for your rebuild. (default is “js”)

There is a `psc-ide-codegen` option that can be set globally in your user config:

(setq psc-ide-codegen '("corefn"))

or in specific files by addind this to the top of file:

-- -*- psc-ide-codegen: ("corefn") -*-


Start the Server C-c C-s

Load all the modules C-c C-l

This isn’t usually necessary, as the start server command sends a load all command after starting the server.

Get completions from the modules you imported while you type (through company-mode)

Get completions from all modules in your project with company-complete

This was bound to C-SPC in earlier versions but was too intrusive for usual emacs users so you’ll have to bind it to a key of choice.

eg. (global-set-key (kbd "C-SPC") 'company-complete)

Show type for identifier under cursor C-c C-t

Prepending the universal argument expands type synonyms in the displayed type.

For example: C-c C-t might return getName :: Person -> String

If Person is a type synonym for a record you can use the universal argument to inspect that record:

C-u C-c C-t will then return getName :: { name :: String, age :: Int } -> String

Go to definition M-.

You can use M-, to jump back to where you came from . If your sourcefiles are not captured by the default globs you can add a .dir-locals.el file to the root of your project, like so:

  . ((psc-ide-source-globs
      . ("src/**/*.purs" "test/**/*.purs" "examples/**/*.purs")))))

Modify the globs accordingly and don’t worry about dependency globs for bower, psc-package or spago projects. The plugin picks these up by default. Check the doc-string for `psc-ide-source-globs` for some advanced options.

Add an import for the identifier under cursor C-c C-i

If the import is ambiguous you will get a selection of modules, from which you can choose the identifier you want.

Add an import on completion (turned on by default)

Can be turned off with:

(customize-set-variable 'psc-ide-add-import-on-completion nil)

Case Split the given type under cursor C-c C-c

Add a clause for the function definition under cursor C-c C-a

Rebuild the current module and get quick error reporting C-c C-b

If you set (customize-set-variable 'psc-ide-rebuild-on-save t) psc-ide will try to rebuild your module on every save.

Flycheck Support

Ignore certain errors or warnings

This is determined by the variable psc-ide-flycheck-ignored-error-codes. It can be configured with customize-option or similar methods.

Insert suggestion from error C-c M-s

When the cursor is placed over an error that includes suggestion information, use C-c M-s to apply the suggestion.


C-c C-spsc-ide-server-start
C-c C-qpsc-ide-server-quit
C-c C-tpsc-ide-show-type
C-c C-ipsc-ide-add-import
C-c C-apsc-ide-add-clause
C-c C-cpsc-ide-case-split
C-c C-lpsc-ide-load-all
C-c C-bpsc-ide-rebuild
C-c C-S-lpsc-ide-load-module
C-c M-spsc-ide-flycheck-insert-suggestion