
Security News
Software Engineering Daily Podcast: Feross on AI, Open Source, and Supply Chain Risk
Socket CEO Feross Aboukhadijeh joins Software Engineering Daily to discuss modern software supply chain attacks and rising AI-driven security risks.
purescript-language-server
Advanced tools
Language Server Protocol server for PureScript wrapping purs ide server functionality
Node-based Language Server Protocol server for PureScript based on the PureScript IDE server
(aka psc-ide / purs ide server). Used as the vscode plugin
backend but should be compatible with other Language Server Client implementations.
The language server is a wrapper around the IDE server included as part of the compiler distribution,
providing editing assistance and build features according to support available. This means that
the server will start its own purs ide server instance to talk to for the project directory it is started
in.
purs compile / configured build command) - provides diagnosticspurescript.*This LSP implmementation is consumed by vscode and Atom plugins as a node module, and bundled along with those plugins.
To use with another LSP client, you will want to install this either globally or locally for npm, e.g.
npm i -g purescript-language-server
And then use the resulting executable, e.g. purescript-language-server --stdio.
This language server is based on vscode-languageserver-node which means it should support --stdio, --socket=[number], --node-ipc or --pipe methods of communication, see vscode-languageserver-node for details.
PureScript compiler version support is as follows:
The purescript-language-server comes with support for formatting PureScript code via several external tools, exposed as a standard LSP formatting provider. When a formatting operation is requested, purescript-language-server will attempt to find the configured tool via its standard name in your $PATH (or the local npm install path if purescript.addNpmPath is set).
The formatting tool is selected via purescript.formatter, with the following options
purs-tidy (or simply tidy). If you do not have any existing preferences this would be the suggested pick.posepurtyUse atom-ide-purescript.
As of 0.5.0, Neovim has a built-in language server client. A popular plugin to help with configuring this server is nvim-lspconfig. This plugin includes purescriptls which will automatically find and root the language server as well as connect PSCIDE, etc. (for more info, read the config). To use, add this to your init.lua or inside a EOF << lua … EOF block in your init.vim.
nvim_lsp.purescriptls.setup {
" Your personal on_attach function referenced before to include
" keymaps & other ls options
on_attach = on_attach,
settings = {
purescript = {
addSpagoSources = true -- e.g. any purescript language-server config here
}
},
flags = {
debounce_text_changes = 150,
}
}
Use nvimmer-ps.
Auto configuration with vim-lsp-settings
Configuration with coc.nvim
Run :CocConfig and add "purescript" in the "languageserver" section as follows:
"languageserver": {
"purescript": {
"command": "purescript-language-server",
"args": ["--stdio"],
"filetypes": ["purescript"],
"trace.server": "off",
"rootPatterns": ["bower.json", "psc-package.json", "spago.dhall"],
"settings": {
"purescript": {
"addSpagoSources": true,
"addNpmPath": true, // Set to true if using a local purty install for formatting
"formatter": "purs-tidy"
// etc
}
}
}
}
CoC can be configured to format your code using the purescript-language-server's formatting provider, which is backed by purty. If you don't have CoC-based code formatting setup in CoC already, you can add a command or key mapping like this:
command! -nargs=0 Format :call CocAction('format')
nmap <leader>f :Format<cr>
If you want the formatter to run on save, run :CocConfig and add "purescript" to the "coc.preferences.formatOnSaveFiletypes":
"coc.preferences.formatOnSaveFiletypes": [
// ...other languages
"purescript"
]
You can also organize PureScript imports in Vim with a command and/or key mapping like this:
command! -nargs=0 OrganizeImports :call CocAction('runCommand', 'editor.action.organizeImport')
nmap <leader>o :OrganizeImports<cr>
Use vimmer-ps.
Config may be supplied via client-push on startup (workspace.didChangeConfiguration), server-request (workspace.configuration), or at last resort by JSON object on the command line with --config option.
See config defined in vscode plugin.
When using the language server together with alternate backends, the only requirement is to stop purs ide server from attempting to generate JS when rebuilding, this is done via the config
"purescript.codegenTargets": [ "corefn" ]
(and you should make sure the build command is in accordance with that, if used, eg specify backend in spago config).
Various commands are provided. Some are triggered via completion etc, some must be called explicitly from a LSP client.
purescript.buildNo arguments. Provides diagnostics.
purescript.startPscIdeNo arguments. Start IDE server according to configuration.
purescript.stopPscIdeNo arguments. Stop running IDE server.
purescript.restartPscIdeNo arguments. Stop any running IDE server then start a new one according to configuration.
purescript.addCompletionImportArguments: identifier, module, document URI.
purescript.addModuleImportArguments: module, qualifier, document URI.
purescript.getAvailableModulesNo arguments. Get list of available modules.
purescript.replaceSuggestionArguments: document URI, replacement, replacement range.
purescript.searchFlex search for identifier.
Arguments: search text.
purescript.fixTypoArguments: document URI, line, character.
purescript.caseSplit-explicit(Used to back the case split command in VS Code UI).
Arguments: document URI, line, character, type.
purescript.addClause-explicit(Used to back the add clause command in VS Code UI).
Arguments: document URI, line, character.
purescript.typedHole-explicit(Used to back the purescript.typedHole code action triggered in the VS Code UI)
Arguments: hole name, document URI, hole range, PscIde.Command.TypeInfo of chosen replacement option
To develop (rather than use) this language server
npm installnpm run buildFor 3, if the editor integrates using the node module rather than standalone binary, I suggest using npm link - this will work for atom and vscode at least.
For atom, clone atom-ide-purescript and:
purescript-language-server run npm link, in atom-ide-purescript run npm link purescript-language-serveratom-ide-purescript run apm link to pick up local changesatom-ide-purescript, run npm run bundle to build the plugin itselfFor vscode, clone vscode-ide-purescript and:
npm installpurescript-language-server run npm link, in vscode-ide-purescript run npm link purescript-language-servervscode-ide-purescript in vscode (code .) and hit F5 to "launch extension"See vscode plugin repo, atom plugin. Common code via purescript-ide-purescript-core.
FAQs
Language Server Protocol server for PureScript wrapping purs ide server functionality
We found that purescript-language-server demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket CEO Feross Aboukhadijeh joins Software Engineering Daily to discuss modern software supply chain attacks and rising AI-driven security risks.

Security News
GitHub has revoked npm classic tokens for publishing; maintainers must migrate, but OpenJS warns OIDC trusted publishing still has risky gaps for critical projects.

Security News
Rust’s crates.io team is advancing an RFC to add a Security tab that surfaces RustSec vulnerability and unsoundness advisories directly on crate pages.