- Notifications
You must be signed in to change notification settings - Fork91
VS Code extension for Haskell, powered by haskell-language-server
License
haskell/vscode-haskell
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
This extension adds language support forHaskell, powered by theHaskell Language Server.As almost all features are provided by the server you might find interesting read itsdocumentation.
- Haskell for Visual Studio Code
This Extension comes with "batteries"-included and can manage your Haskell Language Server installations for you,powered byGHCup.Installation ofGHCup can not happen automatically, so if you want your HLS installations to bemanaged by the Extension, you will have to follow theinstallation instructions for GHCup.
Note: Make sure you have a workingghcup
installation, before launching the Extension.
You can watch demos for some of these featureshere.
- Warning and error diagnostics from GHC
- Type information and documentation on hover
- Jump to definition:for now only for local code definitions
- Document symbols
- Highlight references in document
- Code completion
- Show documentation and sources in hackage
- Formatting viaBrittany,Floskell,Fourmolu,Ormolu orStylish Haskell
- Multi-root workspace support
- Code evaluation, see itsTutorial
- Integration withretrie, a powerful, easy-to-use codemodding tool
- Code lenses for explicit import lists
- Generate functions from type signatures, and intelligently complete holes usingWingman (tactics)
- Integration withhlint, the most used haskell linter, to show diagnostics and apply hints viaapply-refact
- Module name suggestions for insertion or correction
- Call hierarchy support
- For standalone
.hs
/.lhs
files,ghc must be installed and on the PATH. The easiest way to install it is withghcup. - For Cabal based projects, both ghc andcabal-install must be installed and on the PATH. It can also be installed withghcup orChocolatey on Windows.
- For Stack based projects,stack must be installed and on the PATH and must beconfigured to use GHC binaries installed by GHCup.
- If you are installing from an offline VSIX file, you need to installlanguage-haskell too after installation (either from the marketplace or offline).
- Alternatively, you can let the extension manage your entire toolchain automatically (you'll be asked on first startup) viaghcup, which should be pre-installed
For a general picture about the server configuration, including the project setup,you can consult the server documentation about the topic.
For information on how to set configuration in VSCode, seehere.
If your server is manually installed and not on your path, you can also manually set the path to the executable.
"haskell.serverExecutablePath":"~/.local/bin/haskell-language-server"
There are a few placeholders which will be expanded:
~
,${HOME}
and${home}
will be expanded into your users' home folder.${workspaceFolder}
and${workspaceRoot}
will expand into your current project root.
The option hasmachine-overridable
scope so it can be changed per workspace.This supposes it could be used to execute arbitrary programs adding a.vscode/settings.json
in the workspace folder including this option with the appropriate path.See#387 for more details.
You can add additional environment variables for the lsp server using the configuration optionhaskell.serverEnvironment
. For example, to change the cache directory used by the server you could set:
{"haskell.serverEnvironment": {"XDG_CACHE_HOME":"/path/to/my/cache" } }
as the server uses the XDG specification for cache directories.
The environmentonly will be visible for the lsp server, not for other extension tasks like find the server executable.
This extension will downloadhaskell-language-server
binaries and the rest of the toolchain if you selected to use GHCup duringfirst start. Check thehaskell.manageHLS
setting.
It will then download the newest version of haskell-language-server which has support for the required ghc.That means it could use an older version than the latest one, without the last features and bug fixes.For example, if a project needs ghc-8.10.4 the extension will download and use haskell-language-server-1.4.0, the latest version which supported ghc-8.10.4. Even if the latest global haskell language-server version is 1.5.1.
If you have disk space issues, checkghcup gc --help
.
You can also instruct the extension to use a different installation directory for the toolchain,e.g. to not interfere with system GHCup installation. Depending on your platform, add the fullresolved path like so:
"haskell.serverEnvironment": {"GHCUP_INSTALL_BASE_PREFIX":"/home/foo/.config/Code/User/globalStorage/haskell.haskell/" }
The internal storage paths for the extension depend on the platform:
Platform | Path |
---|---|
macOS | ~/Library/Application\ Support/Code/User/globalStorage/haskell.haskell/.ghcup |
Windows | %APPDATA%\Code\User\globalStorage\haskell.haskell\ghcup |
Linux | $HOME/.config/Code/User/globalStorage/haskell.haskell/.ghcup |
If you want to manage HLS yourself, sethaskell.manageHLS
toPATH
and make sure HLS is in your PATHor sethaskell.serverExecutablePath
(overrides all other settings) to a valid executable.
If you need to set mirrors for ghcup download info, check the settingshaskell.metadataURL
andhaskell.releasesURL
.
WhenmanageHLS
is set toGHCup
, you can define a specific toolchain (hls
,ghc
,cabal
andstack
),either globally or per project. E.g.:
{"haskell.toolchain": {"hls":"1.6.1.1","cabal":"recommended","stack":null }}
This means:
- install the
ghc
version corresponding to the project (default, because it's omitted) - install
hls
1.6.1.1 - install the recommended
cabal
version from ghcup - don't install any
stack
version
Another config could be:
{"haskell.toolchain": {"ghc":"9.2.2","hls":"latest","cabal":"recommended" }}
Meaning:
- install
ghc
9.2.2 regardless of what the project requires - always install latest
hls
, even if it doesn't support the given GHC version - install recommended
cabal
- install latest
stack
(default, because it's omitted)
The defaults (when omitted) are as follows:
- install the project required
ghc
(corresponding towith-compiler
setting incabal.project
for example) - install the latest
hls
version that supports the project required ghc version - install latest
cabal
- install latest
stack
When a the value isnull
, the extension will refrain from installing it.
At last, if you don't wantghcup
to manage any of the external tools excepthls
, you can use:
{"haskell.toolchain": {"ghc":null,"cabal":null,"stack":null }}
You can check each GHC version's support status and the policy followed for deprecationshere.
Building from source may support more versions!
The exact list of binaries can be checked in the last release of haskell-language-server:https://github.com/haskell/haskell-language-server/releases/latest
First, check outwhat multi-root workspaces are. The idea of using multi-root workspaces, is to be able to work on several different Haskell projects, where the GHC version or stackage LTS could differ, and have it work smoothly.
The language server is now started for each workspace folder you have in your multi-root workspace, and several configurations are on a resource (i.e. folder) scope, instead of window (i.e. global) scope.
- Go to extensions and right click
Haskell
and chooseExtensions Settings
- Scroll down to
Haskell › Trace: Server
and set it tomessages
. - Set
Haskell › Trace: Client
todebug
. It will print all the environment variables so take care it does not contain any sensitive information before sharing it. - Restart vscode and reproduce your problem
- Go to the main menu and choose
View -> Output
(Ctrl + Shift + U
) - On the new Output panel that opens on the right side in the drop down menu choose
Haskell (<your project>)
Please include the output when filing any issues on thehaskell-language-server issue tracker.
- Usually the error or unexpected behaviour is already reported in thehaskell language server issue tracker. Finding the issue could be useful to help resolve it and sometimes includes a workaround for the issue.
- You can also check thetroubleshooting section in the server documentation.
- Sometimes the language server might get stuck in a rut and stop responding to your latest changes.Should this occur you can try restarting the language server withCtrlshiftP/⌘shiftP > Restart Haskell LSP Server.
If you have installed stack via the official cannels, the binary will not be M1 native, but x86 and trigger the rosetta compatibility layer. GHCup provides real stack/HLS M1 binaries, so make sure you install stack via GHCup. Also seehaskell/haskell-language-server#2864
If you are using certain versions of GHC (such as 9.0.2 or 9.2.4) while running Stack, you may encounter this issue due to an outdated GHC bindist installed by Stack. The vscode-haskell extension does not support the use of GHC binaries managed by Stack. Therefore, it is recommended to configure Stack to allow GHCup to install these binaries instead. Pleaserefer to the instructions provided by ghcup for this purpose.
If you really want to use GHC 9.0.2 managed by Stack, force it to install the fixed bindist (that includes profiling libs) by adding this to your stack.yaml (depending on your platform):
setup-info:ghc:linux64-tinfo6:9.0.2:url:'https://downloads.haskell.org/ghc/9.0.2/ghc-9.0.2a-x86_64-fedora27-linux.tar.xz'
Now make sure to remove cached/installed libraries to avoid getting segfaults at runtime.
As a final workaround, you can try to compile HLS from source (the extension should pick it up) via ghcup, seehttps://haskell-language-server.readthedocs.io/en/stable/installation.html#ghcup. In any case, the recommended approach is to let GHCup install the GHC binaries.
This problem was encountered on darwin M2 with ghcup.Should you see the error that the "Haskell server crashed 5 times in the last 3 minutes," you can check the Haskell output to see whether this was due to an error mentioninghGetContents: invalid argument (invalid byte sequence)
.If this is the case, settingterminal.integrated.detectLocale
tooff
might resolve your issue.
If something just doesn't work, but you recall an old configuration that did, youmay try forcing a particular setting, e.g. by disabling all automatic installationsexcept HLS:
"haskell.toolchain": {"hls":"1.6.1.0","ghc":null,"cabal":null,"stack":null }
Also make sure GHCup is installed and in$PATH
. If you're not starting VSCode from the terminal, you might need to add${HOME}/.ghcup/bin
to PATH like so:
"haskell.serverEnvironment": {"PATH":"${HOME}/.ghcup/bin:$PATH" }
If you want to help, get started by readingContributing for more details.
See theChangelog for more details.
About
VS Code extension for Haskell, powered by haskell-language-server
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.