a2b7710a17
Default the number of Shake threads to 0 (automatic) |
||
---|---|---|
.circleci | ||
exe | ||
ghcide@0db329a623 | ||
install | ||
src/Ide | ||
test | ||
test-logs | ||
.editorconfig | ||
.gitignore | ||
.gitmodules | ||
cabal-hls-install | ||
cabal-hls-install.cmd | ||
cabal.project | ||
ChangeLog.md | ||
CODE_OF_CONDUCT.md | ||
haskell-language-server.cabal | ||
hie.yaml.cbl | ||
hie.yaml.stack | ||
install.hs | ||
LICENSE | ||
README.md | ||
Setup.hs | ||
stack-8.6.4.yaml | ||
stack-8.6.5.yaml | ||
stack-8.8.2.yaml | ||
stack-8.8.3.yaml | ||
stack-8.10.1.yaml | ||
stack.yaml |
haskell-language-server
Integration point for ghcide and haskell-ide-engine. One IDE to rule them all. Read the project's background.
This is very early stage software.
Installation
For now only installation from source is supported.
Installation from source
Common pre-requirements
stack
orcabal
must be in your PATH- You need stack version >= 2.1.1 or cabal >= 2.4.0.0
git
must be in your PATH- The directory where
stack
orcabal
put the binaries must be in you PATH:- For stack you can get it with
stack path --local-bin
- For cabal it is by default
$HOME/.cabal/bin
in linux and%APPDATA%\cabal\bin
in windows.
- For stack you can get it with
Tip: you can quickly check if some command is in your path by running the command. If you receive some meaningful output instead of "command not found"-like message then it means you have the command in PATH.
Linux-specific pre-requirements
On Linux you will need install a couple of extra libraries (for Unicode (ICU) and NCURSES):
Debian 9/Ubuntu 18.04 or earlier:
sudo apt install libicu-dev libtinfo-dev libgmp-dev
Debian 10/Ubuntu 18.10 or later:
sudo apt install libicu-dev libncurses-dev libgmp-dev
Fedora:
sudo dnf install libicu-devel ncurses-devel # also zlib-devel if not already installed
Windows-specific pre-requirements
In order to avoid problems with long paths on Windows you can do either one of the following:
-
Clone the
haskell-language-server
to a short path, for example the root of your logical drive (e.g. toC:\hls
). Even if you chooseC:\haskell-language-server
you could hit the problem. If this doesn't work or you want to use a longer path, try the second option. -
If the
Local Group Policy Editor
is available on your system, go to:Local Computer Policy -> Computer Configuration -> Administrative Templates -> System -> Filesystem
setEnable Win32 long paths
toEnabled
. If you don't have the policy editor you can use regedit by using the following instructions here. You also need to configure git to allow longer paths by using unicode paths. To set this for all your git repositories usegit config --system core.longpaths true
(you probably need an administrative shell for this) or for just this one repository usegit config core.longpaths true
.
In addition make sure haskell-language-server.exe
is not running by closing your editor, otherwise in case of an upgrade the executable can not be installed.
Download the source code
git clone https://github.com/haskell/haskell-language-server --recurse-submodules
cd haskell-language-server
Building
Note, on first invocation of the build script with stack, a GHC is being installed for execution.
The GHC used for the install.hs
can be adjusted in ./install/shake.yaml
by using a different resolver.
Available commands can be seen with:
stack ./install.hs help
Remember, this will take time to download a Stackage-LTS and an appropriate GHC for build haskell-language-server the first time.
Install via cabal
The install-script can be invoked via cabal
instead of stack
with the command
cabal v2-run ./install.hs --project-file install/shake.project <target>
or using the existing alias script
./cabal-hls-install <target>
Running the script with cabal on windows requires a cabal version greater or equal to 3.0.0.0
.
For brevity, only the stack
-based commands are presented in the following sections.
Install specific GHC Version
Install haskell-language-server for the latest available and supported GHC version (and hoogle docs):
stack ./install.hs hls
Install haskell-language-server for a specific GHC version (and hoogle docs):
stack ./install.hs hls-8.8.3
stack ./install.hs data
The Haskell Language Server can also be built with cabal v2-build
instead of stack build
.
This has the advantage that you can decide how the GHC versions have been installed.
To see what GHC versions are available, the command cabal-hls-install ghcs
can be used.
It will list all supported GHC versions that are on the path for build with their respective installation directory.
If you think, this list is incomplete, you can try to modify the PATH variable, such that the executables can be found.
Note, that the targets hls
and data
depend on the found GHC versions.
An example output is:
> ./cabal-hls-install ghcs
******************************************************************
Found the following GHC paths:
ghc-8.6.5: /opt/bin/ghc-8.6.5
ghc-8.8.3: /opt/bin/ghc-8.8.3
******************************************************************
If your desired ghc has been found, you use it to install haskell-language-server.
./cabal-hls-install hls-8.6.5
./cabal-hls-install data
Project Configuration
For a full explanation of possible configurations, refer to hie-bios/README.
haskell-language-server has some limited support via hie-bios to detect automatically your project configuration and set up the environment for GHC. The plan is to improve it to handle most use cases.
However, for now, the more reliable way is using a hie.yaml
file in the root
of the workspace to explicitly describe how to setup the environment.
For that you need to know what components have your project and the path
associated with each one. So you will need some knowledge about
stack or cabal components.
You also can use this utility to generate automatically hie.yaml
files for
the most common stack and cabal configurations
For example, to state that you want to use stack
then the configuration file
would look like:
cradle:
stack:
component: "haskell-language-server:lib"
If you use cabal
then you probably need to specify which component you want
to use.
cradle:
cabal:
component: "lib:haskell-language-server"
If you have a project with multiple components, you can use a cabal-multi cradle:
cradle:
cabal:
- path: "./test/functional/"
component: "haskell-language-server:func-test"
- path: "./test/utils/"
component: "haskell-language-server:hls-test-utils"
- path: "./exe/Main.hs"
component: "haskell-language-server:exe:haskell-language-server"
- path: "./exe/Wrapper.hs"
component: "haskell-language-server:exe:haskell-language-server-wrapper"
- path: "./src"
component: "lib:haskell-language-server"
- path: "./ghcide/src"
component: "ghcide:lib:ghcide"
- path: "./ghcide/exe"
component: "ghcide:exe:ghcide"
Equivalently, you can use stack:
cradle:
stack:
- path: "./test/functional/"
component: "haskell-language-server:func-test"
- path: "./exe/Main.hs"
component: "haskell-language-server:exe:haskell-language-server"
- path: "./exe/Wrapper.hs"
component: "haskell-language-server:exe:haskell-language-server-wrapper"
- path: "./src"
component: "haskell-language-server:lib"
- path: "./ghcide/src"
component: "ghcide:lib:ghcide"
- path: "./ghcide/exe"
component: "ghcide:exe:ghcide"
Or you can explicitly state the program which should be used to collect the options by supplying the path to the program. It is interpreted relative to the current working directory if it is not an absolute path.
cradle:
bios:
program: ".hie-bios"
The complete configuration is a subset of
cradle:
cabal:
component: "optional component name"
stack:
component: "optional component name"
bios:
program: "program to run"
dependency-program: "optional program to run"
direct:
arguments: ["list","of","ghc","arguments"]
default:
none:
dependencies:
- someDep
Editor Integration
Note to editor integrators: there is now a haskell-language-server-wrapper executable, which is installed alongside the haskell-language-server executable. When this is invoked in the project root directory, it attempts to work out the GHC version used in the project, and then launch the matching haskell-language-server executable.
All of the editor integrations assume that you have already installed haskell-language-server (see above) and that the installation script put the haskell-language-server binary in your path (usually ~/.local/bin
or ~/.cabal/bin
on linux and macOS).
Using haskell-language-server with Emacs
Install HLS along with the following emacs packages:
Make sure to follow the instructions in the README of each of these packages.
(use-package lsp-haskell
:ensure t
:config
(setq lsp-haskell-process-path-hie "haskell-language-server-wrapper")
;; Comment/uncomment this line to see interactions between lsp client/server.
;;(setq lsp-log-io t)
)
Using haskell-language-server with doom-emacs
Install haskell-language-server, and then enable haskell lang module with lsp flag in .doom.d/init.el
:lang
(haskell +lsp)
in your .doom.d/config.el
file
(use-package lsp-haskell
:ensure t
:config
(setq lsp-haskell-process-path-hie "haskell-language-server-wrapper")
;; Comment/uncomment this line to see interactions between lsp client/server.
;;(setq lsp-log-io t)
)
then do $HOME/.emacs.d/bin/doom refresh
Using haskell-language-server with Kakoune
- Grab a copy of kak-lsp, and follow the setup instructions.
- Point your
kak-lsp.toml
tohaskell-language-server-wrapper
.
[language.haskell]
filetypes = ["haskell"]
roots = ["Setup.hs", "stack.yaml", "*.cabal"]
command = "haskell-language-server-wrapper"
args = ["--lsp"]
Contributing
It's time to join the project!
❤️ Haskell tooling dream is near, we need your help! ❤️
- Join our IRC channel at
#haskell-ide-engine
onfreenode
. - Fork this repo and hack as much as you can.
- Ask @alanz or @hvr to join the project.
Hacking on haskell-language-server
Haskell-language-server can be used on its own project. We have supplied
preset samples of hie.yaml
files for stack and cabal, simply copy
the appropriate template to hie.yaml
and it should work.
hie.yaml.cbl
for cabalhie.yaml.stack
for stack
Two sample hie.yaml
files are provided, hie.yaml.stack
for stack
usage, hie.yaml.cbl
for cabal. Simply copy the relevant one to be
hie.yaml
and it should work.
The developers tend to hang out at our IRC channel at #haskell-ide-engine
on freenode
.