diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,160 @@
 # Changelog for haskell-language-server
 
+## 1.4.0
+
+After a month of vacation a new hls release has arrived:
+
+- Support for ghc 8.10.6 and 8.10.7
+- The ormolu formatter plugin works with ghc 9.0.1
+- *Call hierarchy plugin has been improved* thanks to @July541:
+  - Add call from type signature
+  - Add call from a function pattern
+  - Go to typeclass instance directly
+- As usual @isovector has been busy improving wingman plugin:
+  - New "intro and destruct" code action
+  - Streaming tactic solutions: when Wingman times outs, it can still pick the best solution it found
+  - Let-bindings in metattactics: allows you to bind variables in tactic metaprogram
+  - Several bug fixes
+- We have new docs thanks to @michaelpj: <https://haskell-language-server.readthedocs.io>
+- Now you can ask the executable for included plugins with: `haskell-language-server --list-plugins`
+- There are several bug fixes and features you can found in the merged pull requests list
+
+### DEPRECATION NOTICE
+
+- *After* this release we will drop support for ghc versions 8.6.4, 8.10.3 and 8.10.4
+  - The advise is upgrade ghc to the last minor version: 8.6.5 or 8.10.7
+  - Take a look to [this issue](https://github.com/haskell/haskell-language-server/issues/2168) for more details
+
+### Pull requests merged for 1.4.0
+
+- Update flake to fix nix builds
+([#2188](https://github.com/haskell/haskell-language-server/pull/2188)) by @jneira
+- Completions for project identifiers
+([#2187](https://github.com/haskell/haskell-language-server/pull/2187)) by @pepeiborra
+- Wingman: Don't clobber where clauses
+([#2184](https://github.com/haskell/haskell-language-server/pull/2184)) by @isovector
+- Add rerun workflow
+([#2181](https://github.com/haskell/haskell-language-server/pull/2181)) by @jneira
+- Bump up shake-bench version
+([#2178](https://github.com/haskell/haskell-language-server/pull/2178)) by @jneira
+- Fix hackage release
+([#2177](https://github.com/haskell/haskell-language-server/pull/2177)) by @jneira
+- Use maxBound of uinteger not Int.
+([#2169](https://github.com/haskell/haskell-language-server/pull/2169)) by @pranaysashank
+- enable the PR gitpod badge and drop the label
+([#2167](https://github.com/haskell/haskell-language-server/pull/2167)) by @pepeiborra
+- Plugin in config files
+([#2166](https://github.com/haskell/haskell-language-server/pull/2166)) by @jneira
+- Complete contributing guide
+([#2165](https://github.com/haskell/haskell-language-server/pull/2165)) by @jneira
+- Wingman: Add "New Unification Variable" helper
+([#2164](https://github.com/haskell/haskell-language-server/pull/2164)) by @isovector
+- Semiautomatic hackage releases
+([#2163](https://github.com/haskell/haskell-language-server/pull/2163)) by @jneira
+- Improve incoming call for typeclass and type family instance
+([#2162](https://github.com/haskell/haskell-language-server/pull/2162)) by @July541
+- Add a Gitpod descriptor
+([#2161](https://github.com/haskell/haskell-language-server/pull/2161)) by @pepeiborra
+- Wingman: Let-bindings in metatactics
+([#2160](https://github.com/haskell/haskell-language-server/pull/2160)) by @isovector
+- Update nix flake
+([#2159](https://github.com/haskell/haskell-language-server/pull/2159)) by @lf-
+- Add ghc-8.10.7 to release build
+([#2158](https://github.com/haskell/haskell-language-server/pull/2158)) by @jneira
+- Reduce duplication in pragma tests
+([#2157](https://github.com/haskell/haskell-language-server/pull/2157)) by @nini-faroux
+- Remove ghc-api source snapshot
+([#2156](https://github.com/haskell/haskell-language-server/pull/2156)) by @pepeiborra
+- Create a citation
+([#2155](https://github.com/haskell/haskell-language-server/pull/2155)) by @ndmitchell
+- Disable window job for ghc-8.10.2
+([#2154](https://github.com/haskell/haskell-language-server/pull/2154)) by @jneira
+- Auto complete definitions within imports
+([#2152](https://github.com/haskell/haskell-language-server/pull/2152)) by @alexnaspo
+- Filter code actions based on prefix, not equality
+([#2146](https://github.com/haskell/haskell-language-server/pull/2146)) by @michaelpj
+- perform a GC before find resolution
+([#2144](https://github.com/haskell/haskell-language-server/pull/2144)) by @pepeiborra
+- case sensitive language pragmas fix
+([#2142](https://github.com/haskell/haskell-language-server/pull/2142)) by @alexnaspo
+- Add ghc-8.10.7 support
+([#2141](https://github.com/haskell/haskell-language-server/pull/2141)) by @jneira
+- List all available plugins
+([#2139](https://github.com/haskell/haskell-language-server/pull/2139)) by @July541
+- update LTS for GHC 8.10.6
+([#2138](https://github.com/haskell/haskell-language-server/pull/2138)) by @peterbecich
+- fix GitHub Actions badges
+([#2135](https://github.com/haskell/haskell-language-server/pull/2135)) by @peterbecich
+- Move pragmas completion to pragmas plugin
+([#2134](https://github.com/haskell/haskell-language-server/pull/2134)) by @alexnaspo
+- Update ghc-9.0.1 support
+([#2131](https://github.com/haskell/haskell-language-server/pull/2131)) by @jneira
+- Support call hierarchy on pattern matching
+([#2129](https://github.com/haskell/haskell-language-server/pull/2129)) by @July541
+- GHCIDE_BUILD_PROFILING env var
+([#2125](https://github.com/haskell/haskell-language-server/pull/2125)) by @pepeiborra
+- [ghcide] support -d cli switch
+([#2124](https://github.com/haskell/haskell-language-server/pull/2124)) by @pepeiborra
+- don't crash when an unused operator import ends in `.`
+([#2123](https://github.com/haskell/haskell-language-server/pull/2123)) by @tscholak
+- [benchmarks] Fix edit and "after edit" experiments
+([#2122](https://github.com/haskell/haskell-language-server/pull/2122)) by @pepeiborra
+- Add fix for correct placement of import (#2100)
+([#2116](https://github.com/haskell/haskell-language-server/pull/2116)) by @nini-faroux
+- Support for ghc-8.10.6
+([#2109](https://github.com/haskell/haskell-language-server/pull/2109)) by @jneira
+- New rename plugin implementation
+([#2108](https://github.com/haskell/haskell-language-server/pull/2108)) by @OliverMadine
+- [ghcide-bench] Support extra args in examples
+([#2107](https://github.com/haskell/haskell-language-server/pull/2107)) by @pepeiborra
+- Fix filepath identity in cradle dependencies when using reactive change tracking
+([#2106](https://github.com/haskell/haskell-language-server/pull/2106)) by @pepeiborra
+- [ghcide-bench] preserve threading details in eventlogs
+([#2105](https://github.com/haskell/haskell-language-server/pull/2105)) by @pepeiborra
+- [ghcide-bench] fix edit experiment
+([#2104](https://github.com/haskell/haskell-language-server/pull/2104)) by @pepeiborra
+([#2102](https://github.com/haskell/haskell-language-server/pull/2102)) by @isovector
+- reduce allow-newer entries for shake-bench
+([#2101](https://github.com/haskell/haskell-language-server/pull/2101)) by @pepeiborra
+- Wingman: Don't count it as using a term if you only destruct it
+([#2099](https://github.com/haskell/haskell-language-server/pull/2099)) by @isovector
+- Clean cabal project
+([#2097](https://github.com/haskell/haskell-language-server/pull/2097)) by @jneira
+- Wingman: New AbstractLSP interface
+([#2094](https://github.com/haskell/haskell-language-server/pull/2094)) by @isovector
+- Add badge with github release
+([#2093](https://github.com/haskell/haskell-language-server/pull/2093)) by @jneira
+- Add a bit more prose and some links to the README
+([#2090](https://github.com/haskell/haskell-language-server/pull/2090)) by @michaelpj
+- Enable tests for ormolu plugin
+([#2086](https://github.com/haskell/haskell-language-server/pull/2086)) by @felixonmars
+- Allow ormolu 0.2 and fix compatibility with GHC 9
+([#2084](https://github.com/haskell/haskell-language-server/pull/2084)) by @felixonmars
+- Add initial sphinx doc site for RTD
+([#2083](https://github.com/haskell/haskell-language-server/pull/2083)) by @michaelpj
+- Amend fix for correct placement of file header pragmas (#1958)
+([#2078](https://github.com/haskell/haskell-language-server/pull/2078)) by @nini-faroux
+- Wingman: "Intro and destruct" code action
+([#2077](https://github.com/haskell/haskell-language-server/pull/2077)) by @isovector
+- Support call hierarchy on type signature & add plugin to generic config  & docs
+([#2072](https://github.com/haskell/haskell-language-server/pull/2072)) by @July541
+- Update nix flake
+([#2065](https://github.com/haskell/haskell-language-server/pull/2065)) by @berberman
+- Include sponsorship section
+([#2063](https://github.com/haskell/haskell-language-server/pull/2063)) by @jneira
+- Add more communication channels
+([#2062](https://github.com/haskell/haskell-language-server/pull/2062)) by @jneira
+- Don't suggest disabling type errors
+([#2061](https://github.com/haskell/haskell-language-server/pull/2061)) by @anka-213
+- Build with lsp 1.2.0.1
+([#2059](https://github.com/haskell/haskell-language-server/pull/2059)) by @pepeiborra
+- Remove HIE_CACHE from circleci cache key
+([#2050](https://github.com/haskell/haskell-language-server/pull/2050)) by @jneira
+- [#1958] Fix placement of language pragmas
+([#2043](https://github.com/haskell/haskell-language-server/pull/2043)) by @nini-faroux
+- [#2005] Fix Formatting When Brittany Returns Warnings
+([#2036](https://github.com/haskell/haskell-language-server/pull/2036)) by @prikhi
+
 ## 1.3.0
 
 2021 July release of HLS arrives! This release includes binaries for GHC 9.0.1
@@ -23,7 +178,7 @@
   - Wingman now gives a warning if it ran out of gas during "attempt to fill hole".
   - Metaprogramming for Wingman has been improved with symbolic-name support and the `pointwise` combinator.
   - An option to enable/disable Wingman's proof state styling is added.
-  - Hole fit suggestions are now disabled for performance reasons when using Wingman. 
+  - Hole fit suggestions are now disabled for performance reasons when using Wingman.
 - Hovering on a name displays the package where the name is defined, contributed by @berberman.
   ![hover](https://user-images.githubusercontent.com/12473268/127550516-acc1f1b4-bad7-44fd-99a0-a174ce9ac909.gif)
 
@@ -160,15 +315,15 @@
 Thanks for all contributors, many bugs has been fixed, and many features has landed.
 Here are the summary of changes:
 
-- Basic support for GHC 9.0.1 is added.  
+- Basic support for GHC 9.0.1 is added.
   It does not support all plugins yet, but core GHCIDE features will work. For the detailed information that which plugins work, please refer [this list](https://github.com/haskell/haskell-language-server/issues/297#issuecomment-855522891).
-- Support for GHC 8.10.5 is added.  
+- Support for GHC 8.10.5 is added.
   Note that macOS version is unfortunately not included in this release because of [a GHC issue with `network` package](https://gitlab.haskell.org/ghc/ghc/-/issues/19968).
-- HLS wrapper and GHCIDE session loader uses the same logic with implicit-hie.  
+- HLS wrapper and GHCIDE session loader uses the same logic with implicit-hie.
   This fixes [a build issue](https://github.com/haskell/haskell-language-server/issues/1782) of a stack project with implicit `hie.yaml` .
 - Wingman plugin has added numerous features and fixed many bugs:
-  - It now supports tactic metaprogramming!  
-    For list of commands, see [this document](https://github.com/haskell/haskell-language-server/blob/master/plugins/hls-tactics-plugin/COMMANDS.md#wingman-metaprogram-command-reference).  
+  - It now supports tactic metaprogramming!
+    For list of commands, see [this document](https://github.com/haskell/haskell-language-server/blob/master/plugins/hls-tactics-plugin/COMMANDS.md#wingman-metaprogram-command-reference).
     ![https://github.com/haskell/haskell-language-server/blob/master/plugins/hls-tactics-plugin/COMMANDS.md#wingman-metaprogram-command-reference](https://user-images.githubusercontent.com/307223/118190278-bdf24f80-b3f7-11eb-8838-b08a2582d7f1.gif)
   - "Refine hole" and "Split all function arguments" code actions are publicly opened.
   - "Empty case split" code lens is added.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -2,11 +2,13 @@
 
 ![haskell-language-server][logo]
 
+
+[![Release][badge-github-release]][github-release]
 [![Hackage][badge-hackage]][hackage]
 [![License Apache 2.0][badge-license]][license]
 [![CircleCI][badge-circleci]][circleci]
-![Github Testing Workflow](https://github.com/haskell/haskell-language-server/workflows/Testing/badge.svg)
-![Github Nix Workflow](https://github.com/haskell/haskell-language-server/workflows/Nix/badge.svg)
+[![GitHub Testing Workflow](https://github.com/haskell/haskell-language-server/actions/workflows/test.yml/badge.svg)](https://github.com/haskell/haskell-language-server/actions/workflows/test.yml)
+[![GitHub Nix Workflow](https://github.com/haskell/haskell-language-server/actions/workflows/nix.yml/badge.svg)](https://github.com/haskell/haskell-language-server/actions/workflows/nix.yml)
 [![codetriage][badge-codetriage]][codetriage]
 
 [logo]: ./docs/logos/logo-256.png
@@ -15,861 +17,16 @@
 [badge-circleci]: https://img.shields.io/circleci/project/github/haskell/haskell-language-server/master.svg
 [circleci]: https://circleci.com/gh/haskell/haskell-language-server/
 [badge-hackage]: https://img.shields.io/hackage/v/haskell-language-server.svg?logo=haskell
+[badge-github-release]:https://img.shields.io/github/v/release/haskell/haskell-language-server.svg
 [hackage]: https://hackage.haskell.org/package/haskell-language-server
 [badge-codetriage]: https://www.codetriage.com/haskell/haskell-language-server/badges/users.svg
 [codetriage]:https://www.codetriage.com/haskell/haskell-language-server
-
-Integration point for [ghcide](https://github.com/haskell/ghcide) and [haskell-ide-engine](https://github.com/haskell/haskell-ide-engine). One IDE to rule
-them all. Read the [project's
-background](https://neilmitchell.blogspot.com/2020/01/one-haskell-ide-to-rule-them-all.html).
-
-- [haskell-language-server](#haskell-language-server)
-  - [Features](#features)
-  - [Installation](#installation)
-    - [Prerequisites](#prerequisites)
-    - [ghcup](#ghcup)
-    - [Visual Studio Code](#visual-studio-code)
-    - [Pre-built binaries](#pre-built-binaries)
-    - [Arch Linux](#arch-linux)
-    - [FreeBSD](#freebsd)
-    - [Installation from source](#installation-from-source)
-      - [Common pre-requirements](#common-pre-requirements)
-      - [Linux-specific pre-requirements](#linux-specific-pre-requirements)
-      - [Windows-specific pre-requirements](#windows-specific-pre-requirements)
-      - [Download the source code](#download-the-source-code)
-      - [Building](#building)
-        - [Install via cabal](#install-via-cabal)
-        - [Install specific GHC Version](#install-specific-ghc-version)
-    - [Installation from Hackage](#installation-from-hackage)
-    - [Installation via Homebrew](#installation-via-homebrew)
-  - [Configuring `haskell-language-server`](#configuring-haskell-language-server)
-    - [Generic server options](#generic-server-options)
-    - [Generic editor options](#generic-editor-options)
-    - [Language-specific server options](#language-specific-server-options)
-    - [Client options](#client-options)
-  - [Configuring your project build](#configuring-your-project-build)
-  - [Configuring your editor](#configuring-your-editor)
-    - [VS Code](#vs-code)
-    - [Sublime Text](#sublime-text)
-    - [Vim or Neovim](#vim-or-neovim)
-      - [Coc](#coc)
-      - [LanguageClient-neovim](#languageclient-neovim)
-        - [vim-plug](#vim-plug)
-        - [Clone the LanguageClient-neovim repo](#clone-the-languageclient-neovim-repo)
-        - [Configuration and sample `~/.vimrc` sections](#configuration-and-sample-vimrc-sections)
-    - [Atom](#atom)
-    - [Emacs](#emacs)
-      - [doom-emacs](#doom-emacs)
-      - [Spacemacs](#spacemacs)
-    - [Kakoune](#kakoune)
-  - [Known limitations](#known-limitations)
-    - [Preprocessor](#preprocessor)
-  - [Troubleshooting](#troubleshooting)
-    - [Common issues](#common-issues)
-      - [Difficulties with Stack and `Paths_` modules](#difficulties-with-stack-and-paths_-modules)
-      - [Problems with dynamic linking](#problems-with-dynamic-linking)
-    - [Troubleshooting the server](#troubleshooting-the-server)
-      - [Diagnostic mode](#diagnostic-mode)
-      - [Examining the log](#examining-the-log)
-    - [Troubleshooting the client](#troubleshooting-the-client)
-  - [Contributing](#contributing)
-    - [Style guidelines](#style-guidelines)
-    - [Building haskell-language-server](#building-haskell-language-server)
-      - [Using Cabal](#using-cabal)
-      - [Using Stack](#using-stack)
-      - [Using Nix](#using-nix)
-        - [Flakes support](#flakes-support)
-      - [Introduction tutorial](#introduction-tutorial)
-      - [Test your hacked HLS in your editor](#test-your-hacked-hls-in-your-editor)
-    - [Adding support for a new editor](#adding-support-for-a-new-editor)
-
-## Features
-
-- Code evaluation codelens ([Tutorial](plugins/hls-eval-plugin/README.md)):
-
-   ![Eval Demo](plugins/hls-eval-plugin/demo.gif)
-
-- Type information and documentation on hover. Note that currently, in order for docs to be displayed for dependencies, they must have been built with GHC's `-haddock` flag:
-
-  - For cabal:
-      - Add to your global config file (e.g. `~/.cabal/config`):
-
-        ```cabal
-        program-default-options
-          ghc-options: -haddock
-        ```
-
-      - Or, for a single project, run `cabal configure --ghc-options=-haddock`
-
-  - For stack, add to global `$STACK_ROOT\config.yaml`, or project's `stack.yaml`:
-
-    ```cabal
-    ghc-options:
-      "$everything": -haddock
-    ```
-
-  This will cause compilation errors if a dependency contains invalid Haddock markup, though from GHC version 9.0, [these will be demoted to warnings](https://gitlab.haskell.org/ghc/ghc/-/merge_requests/2377).
-
- - Integration with [retrie](https://hackage.haskell.org/package/retrie)
-
-   ![Retrie](https://i.imgur.com/Ev7B87k.gif)
-
- - Code lenses for explicit import lists
-
-   ![Imports code lens](https://imgur.com/pX9kvY4.gif)
-
- - Many more (TBD)
-
-## Installation
-
-### Prerequisites
-
-- For standalone `.hs`/`.lhs` files, [ghc](https://www.haskell.org/ghc/) must be installed and on the PATH. The easiest way to install it is with [ghcup](https://www.haskell.org/ghcup/) or [chocolatey](https://community.chocolatey.org/packages/ghc) on Windows.
-- For Cabal based projects, both ghc and [cabal-install](https://www.haskell.org/cabal/) must be installed and on the PATH. It can also be installed with [ghcup](https://www.haskell.org/ghcup/) or [chocolatey](https://community.chocolatey.org/packages/cabal) on Windows.
-- For Stack based projects, [stack](http://haskellstack.org) must be installed and on the PATH.
-
-### ghcup
-
-If you are using [`ghcup`](https://www.haskell.org/ghcup/) to manage your installations, you can install `haskell-language-server` with
-```
-ghcup install hls
-```
-
-### chocolatey
-
-If you are using [`chocolatey`](https://chocolatey.org/) to manage your installations in windows, [you can install `haskell-language-server`](https://community.chocolatey.org/packages/haskell-language-server) with
-```
-choco install haskell-language-server
-````
-
-### Visual Studio Code
-
-If you are using Visual Studio Code, the [Haskell extension](https://marketplace.visualstudio.com/items?itemName=haskell.haskell) will automatically download and install `haskell-language-server` for you.
-
-### Pre-built binaries
-
-There are pre-built binaries available from the [releases page](https://github.com/haskell/haskell-language-server/releases) for Linux, Windows and macOS.
-To install, download the `haskell-language-server-wrapper` executable for your platform as well as any `haskell-language-server` executables for the GHC versions you plan on working with, and either put them on your PATH or point your client to them.
-
-### Arch Linux
-
-The preferred method of installation for development purposes is to use the [haskell-language-server-bin](https://aur.archlinux.org/packages/haskell-language-server-bin) package from AUR.
-This package contains statically linked binaries for each supported GHC version and `haskell-language-server-wrapper` for automatic GHC version selection.
-It is updated regularly, requires no additional dependencies, and is independent of other haskell packages you may have on your system, including GHC.
-Its size is relatively large (approx. 900 MB), but if this is a problem for you, during installation you can disable the GHC versions you will not be using by editing the PKGBUILD file.
-
-Alternatively, if you want to use **dynamically linked** Haskell packages from `pacman`,
-you can install the latest pre-compiled version of `haskell-language-server` from [[community]](https://archlinux.org/packages/community/x86_64/haskell-language-server/):
-
-```
-sudo pacman -S haskell-language-server
-```
-
-In this case, `haskell-language-server` is compiled against the GHC distributed to Arch Linux, so you will need maintain a system wide Haskell development environment, and install GHC from `pacman` as well.
-See [ArchWiki](https://wiki.archlinux.org/index.php/Haskell) for the details of Haskell infrastructure on Arch Linux.
-
-### FreeBSD
-
-HLS is available for installation from official binary packages. Use
-
-```
-pkg install hs-haskell-language-server
-```
-
-to install it. At the moment, HLS installed this way only supports the same GHC
-version as the ports one.
-
-### Installation from source
-
-#### Common pre-requirements
-
-- `stack` or `cabal` 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`or `cabal` 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.
-
-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:
-
-- [Unicode (ICU)](http://site.icu-project.org/)
-- [NCURSES](https://www.gnu.org/software/ncurses/)
-- [Zlib](https://zlib.net/)
-
-**Debian 9/Ubuntu 18.04 or earlier**:
-
-```bash
-sudo apt install libicu-dev libtinfo-dev libgmp-dev zlib1g-dev
-```
-
-**Debian 10/Ubuntu 18.10 or later**:
-
-```bash
-sudo apt install libicu-dev libncurses-dev libgmp-dev zlib1g-dev
-```
-
-**Fedora**:
-
-```bash
-sudo dnf install libicu-devel ncurses-devel zlib-devel
-```
-
-#### Windows-specific pre-requirements
-
-In order to avoid problems with long paths on Windows you can do either one of the following:
-
-1. Clone the `haskell-language-server` to a short path, for example the root of your logical drive (e.g. to
-   `C:\hls`). Even if you choose `C:\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.
-
-2. If the `Local Group Policy Editor` is available on your system, go to: `Local Computer Policy -> Computer Configuration -> Administrative Templates -> System -> Filesystem` set `Enable Win32 long paths` to `Enabled`. If you don't have the policy editor you can use regedit by using the following instructions [here](https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#enable-long-paths-in-windows-10-version-1607-and-later). You also need to configure git to allow longer paths by using unicode paths. To set this for all your git repositories use `git config --system core.longpaths true` (you probably need an administrative shell for this) or for just this one repository use `git 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
-
-```bash
-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/stack.yaml` by using a different resolver.
-
-Available commands can be seen with:
-
-```bash
-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
-
-```bash
-cabal v2-run ./install.hs --project-file install/shake.project <target>
-```
-
-or using the existing alias script
-
-```bash
-./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
-
-The script will install the executables `haskell-language-server-wrapper` and `haskell-language-server`.
-
-It will copy the latter appending the used ghc version, needed by the wrapper to choose the suitable version
-for the project at hand.
-
-So installing the executables directly with `stack install` or `cabal v2-install` may not be enough
-for it to work properly.
-
-Install haskell-language-server for the latest available and supported GHC version (and hoogle docs):
-
-```bash
-stack ./install.hs hls
-```
-
-Install haskell-language-server for a specific GHC version (and hoogle docs):
-
-```bash
-stack ./install.hs hls-8.8.3
-```
-
-`hls-8.8.3` target will build the project and install `haskell-language-server-wrapper`,
-`haskell-language-server`, `haskell-language-server-8.8.3` and `haskell-language-server-8.8`
-executables.
-
-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:
-
-```bash
-> ./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.
-
-```bash
-./cabal-hls-install hls-8.6.5
-```
-
-### Installation from Hackage
-
-Direct installation from Hackage, while possible via `cabal install haskell-language-server`, is not recommended for most people.
-Said command builds the `haskell-language-server` binary and installs it in the default Cabal binaries folder,
-but the binary will only work with projects that use the same GHC version that built it.
-
-The package can be found here on Hackage: <https://hackage.haskell.org/package/haskell-language-server>
-
-### Installation via Homebrew
-
-Homebrew users can install `haskell-language-server` using the following command:
-
-```bash
-brew install haskell-language-server
-```
-
-This formula contains HLS binaries compiled with GHC versions available via Homebrew; at the moment those are: 8.6.5, 8.8.4, 8.10.4.
-
-You need to provide your own GHC/Cabal/Stack as required by your project, possibly via Homebrew.
-
-## Configuring `haskell-language-server`
-
-Language servers like `haskell-language-server` expose most of their configuration via the client (i.e. the editor).
-That means that the way in which you configure the settings will depend on the client.
-
-Most clients (editors) already have an opinion about how settings should be configured!
-For example, in VS Code you use the graphical Settings tab or `settings.json`, whereas in Emacs you use customization variables.
-In the [editor configuration section](#configuring-your-editor) we give some pointers for popular editors, but you should consult the documentation for your specific editor if you have trouble.
-
-However, we can say some high-level things about the kinds of configuration `haskell-language-server` uses, and how to use them.
-This can sound a bit confusing, but ultimately the client should present you with these options in a user-friendly way that makes sense for that editor.
-
-### Generic server options
-
-The LSP protocol is designed to support many useful server configuration options generically.
-These are sent to the server by the client, and can be controlled without reference to a specific language.
-
-For example, there are protocol methods for highlighting matching identifiers throughout a document.
-This is a capability which any server can implement, so the client can decide generically whether to ask the server to do it or not.
-So your editor can provide a setting to turn this on or off globally, for any language server you might use.
-
-Settings like this are typically provided by the generic LSP client support for your editor, for example in Emacs by `lsp-mode`.
-
-### Generic editor options
-
-Your editor may provide some settings that affect how the information from the language server is used.
-For example, whether popups are shown, or whether code lenses appear by default.
-
-Settings like this are typically provided by the generic LSP client support for your editor, for example in Emacs by `lsp-mode`.
-
-### Language-specific server options
-
-A specific language server can also have its own configuration options.
-These are still sent to the server by the client, but they can only be controlled by a specific client that knows about those options.
-
-For example, `haskell-language-server` allows you to choose the formatting provider which will be used for formatting Haskell source.
-This option obviously would not make sense for language servers for other languages, or even for other Haskell language servers (which need not even support formatting).
-
-Here is a list of the additional settings currently supported by `haskell-language-server`, along with their setting key (you may not need to know this) and default:
-
-- Formatting provider (`haskell.formattingProvider`, default `ormolu`): what formatter to use; one of `floskell`, `ormolu`, `fourmolu`, `stylish-haskell`, or `brittany` (if compiled with the brittany plugin)
-- Format on imports (`haskell.formatOnImportOn`, default true): whether to format after adding an import
-- Diagnostics on change (`haskell.diagnosticsOnChange`, default true): (currently unused)
-- Completion snippets (`haskell.completionSnippetsOn`, default true): whether to support completion snippets
-- Liquid Haskell (`haskell.liquidOn`, default false): whether to enable Liquid Haskell support (currently unused until the Liquid Haskell support is functional again)
-- Hlint (`haskell.hlintOn`, default true): whether to enable Hlint support
-- Max completions (`haskell.maxCompletions`, default 40): maximum number of completions sent to the LSP client.
-
-Settings like this are typically provided by the language-specific LSP client support for your editor, for example in Emacs by `lsp-haskell`.
-
-### Client options
-
-A particular client might also have some options of its own, for example to control how the server executable is started.
-
-Settings like this are typically be provided by the language-specific LSP client support for your editor, for example in Emacs by `lsp-haskell`.
-
-## Configuring your project build
-
-`haskell-language-server` has to compile your project in order to give you diagnostics, which means that it needs to know how to do so.
-This is handled by the [`hie-bios`](https://github.com/mpickering/hie-bios) project.
-
-**For a full explanation of how `hie-bios` determines the project build configuration, and how to configure it manually, refer to the [`hie-bios` README](https://github.com/mpickering/hie-bios/blob/master/README.md).**
-
-At the moment, `haskell-language-server` has some limited support to automatically detect your project build configuration.
-The plan is to improve it to handle most use cases.
-
-However, for now, the most reliable way is to manually configure `hie-bios` using a `hie.yaml` file in the root of the workspace.
-A `hie.yaml` file **explicitly** describes how to setup the environment to compile the various parts of your project.
-For that you need to know what *components* your project has, and the path associated with each one.
-So you will need some knowledge about
-[stack](https://docs.haskellstack.org/en/stable/build_command/#components) or [cabal](https://cabal.readthedocs.io/en/latest/cabal-commands.html?#cabal-v2-build) components.
-
-You also can use [this utility](https://github.com/Avi-D-coder/implicit-hie) to automatically generate `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:
-
-```yaml
-cradle:
-  stack:
-    component: "haskell-language-server:lib"
-```
-
-If you use `cabal` then you probably need to specify which component you want
-to use.
-
-```yaml
-cradle:
-  cabal:
-    component: "lib:haskell-language-server"
-```
-
-If you have a project with multiple components, you can use a cabal-multi
-cradle:
-
-```yaml
-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:
-
-```yaml
-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.
-
-```yaml
-cradle:
-  bios:
-    program: ".hie-bios"
-```
-
-The complete configuration is a subset of
-
-```yaml
-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
-```
-
-## Configuring your editor
-
-Most editors provide a Haskell-specific extension that provides support for launching `haskell-language-server` and talking to it, as well as [exposing configuration options](#configuring-haskell-language-server).
-
-Editors typically assume that you have already installed `haskell-language-server` (see above) and that the installation script put the `haskell-language-server` and `haskell-language-server-wrapper` binaries in your `PATH` (usually `~/.local/bin` or `~/.cabal/bin` on Linux and macOS, `%APPDATA%\local\bin` or `%APPDATA%\cabal\bin` on Windows).
-The exception is VS Code, which can automatically install the binaries if they are not installed already.
-
-### VS Code
-
-Install from
-[the VSCode marketplace](https://marketplace.visualstudio.com/items?itemName=haskell.haskell), or manually from the repository [vscode-haskell](https://github.com/haskell/vscode-haskell).
-The `haskell-language-server` and `haskell-language-server-wrapper` binaries will be automatically downloaded on an ad-hoc basis, but if you have them already installed on your PATH then it will just use them instead.
-
-Configuration is done via the "Haskell" section of "Settings".
-
-### Sublime Text
-
-- Install [LSP](https://packagecontrol.io/packages/LSP) using [Package Control](https://packagecontrol.io/)
-- From Sublime Text, go to Preferences and search for LSP Settings
-- Paste in these settings. Make sure to change the command path to your `haskell-language-server-wrapper`
-
-```json
-{
-  "clients": {
-    "haskell-language-server": {
-      "command": ["haskell-language-server-wrapper", "--lsp"],
-      "scopes": ["source.haskell"],
-      "syntaxes": ["Packages/Haskell/Haskell.sublime-syntax"],
-      "languageId": "haskell"
-    }
-  }
-}
-```
-
-Now open a Haskell project with Sublime Text and enable Language Server in the project.
-You should have these features available:
-
-1. Errors are underlined in red
-2. LSP: Show Diagnostics will show a list of hints and errors
-3. LSP: Format Document will prettify the file
-
-### Vim or Neovim
-
-You can use [Coc](https://github.com/neoclide/coc.nvim), [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim)
-or any other Vim Language server protocol client.
-Coc is recommend since it is the only complete LSP implementation for Vim and Neovim and offers snippets and floating documentation out of the box.
-
-#### Coc
-
-Follow Coc's [installation instructions](https://github.com/neoclide/coc.nvim).
-Then issue `:CocConfig` and add the following to your Coc config file.
-
-```json
-{
-  "languageserver": {
-    "haskell": {
-      "command": "haskell-language-server-wrapper",
-      "args": ["--lsp"],
-      "rootPatterns": ["*.cabal", "stack.yaml", "cabal.project", "package.yaml", "hie.yaml"],
-      "filetypes": ["haskell", "lhaskell"]
-    }
-  }
-}
-```
-
-#### LanguageClient-neovim
-
-##### vim-plug
-
-If you use [vim-plug](https://github.com/junegunn/vim-plug), then you can do this by e.g.,
-including the following line in the Plug section of your `init.vim` or `~/.vimrc`:
-
-```text
-Plug 'autozimu/LanguageClient-neovim', {
-    \ 'branch': 'next',
-    \ 'do': 'bash install.sh'
-    \ }
-```
-
-and issuing a `:PlugInstall` command within Neovim or Vim.
-
-##### Clone the LanguageClient-neovim repo
-
-As an alternative to using [vim-plug](https://github.com/junegunn/vim-plug) shown above, clone [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim)
-into `~/.vim/pack/XXX/start/`, where `XXX` is just a name for your "plugin suite".
-
-##### Configuration and sample `~/.vimrc` sections
-
-```vim
-set rtp+=~/.vim/pack/XXX/start/LanguageClient-neovim
-let g:LanguageClient_serverCommands = { 'haskell': ['haskell-language-server-wrapper', '--lsp'] }
-```
-
-You'll probably want to add some mappings for common commands:
-
-```vim
-nnoremap <F5> :call LanguageClient_contextMenu()<CR>
-map <Leader>lk :call LanguageClient#textDocument_hover()<CR>
-map <Leader>lg :call LanguageClient#textDocument_definition()<CR>
-map <Leader>lr :call LanguageClient#textDocument_rename()<CR>
-map <Leader>lf :call LanguageClient#textDocument_formatting()<CR>
-map <Leader>lb :call LanguageClient#textDocument_references()<CR>
-map <Leader>la :call LanguageClient#textDocument_codeAction()<CR>
-map <Leader>ls :call LanguageClient#textDocument_documentSymbol()<CR>
-```
-
-Use <kbd>Ctrl+x</kbd><kbd>Ctrl+o</kbd> (`<C-x><C-o>`) to open up the auto-complete menu,
-or for asynchronous auto-completion, follow the setup instructions on
-[LanguageClient](https://github.com/autozimu/LanguageClient-neovim).
-
-If you'd like diagnostics to be highlighted, add a highlight group for `ALEError`/`ALEWarning`/`ALEInfo`,
-or customize `g:LanguageClient_diagnosticsDisplay`:
-
-```vim
-hi link ALEError Error
-hi Warning term=underline cterm=underline ctermfg=Yellow gui=undercurl guisp=Gold
-hi link ALEWarning Warning
-hi link ALEInfo SpellCap
-```
-
-If you're finding that the server isn't starting at the correct project root,
-it may also be helpful to also specify root markers:
-
-```vim
-let g:LanguageClient_rootMarkers = ['*.cabal', 'stack.yaml']
-```
-
-Further configuration can be done by pointing the [`g:LanguageClient_settingsPath`](https://github.com/autozimu/LanguageClient-neovim/blob/0e5c9546bfddbaa2b01e5056389c25aefc8bf989/doc/LanguageClient.txt#L221)
-variable to the file in which you want to keep your LSP settings.
-
-### Atom
-
-Install the two Atom packages [atom-ide-ui](https://atom.io/packages/atom-ide-ui) and [haskell](https://atom.io/packages/haskell),
-
-```bash
-$ apm install language-haskell atom-ide-ui haskell
-```
-
-### Emacs
-
-Emacs support is provided by a combination of the following packages:
-
-[lsp-mode](https://github.com/emacs-lsp/lsp-mode)
-[lsp-ui](https://github.com/emacs-lsp/lsp-ui)
-[lsp-haskell](https://github.com/emacs-lsp/lsp-haskell)
-
-You can install these manually if you are using plain Emacs; instructions for some specific flavours
-are included below.
-
-Make sure to check the READMEs of each of these packages, which explain how to configure the
-various parts of the Emacs integration.
-In particular, `lsp-haskell` provides customization options for the `haskell-language-server`-specific parts,
-such as the path to the server executable.
-
-#### [doom-emacs](https://github.com/hlissner/doom-emacs/tree/develop/modules/lang/haskell#module-flags)
-
-Manual installation of packages is not required.
-Enable the lsp module and the haskell lang module with lsp flag in `.doom.d/init.el`:
-
-``` emacs-lisp
-:tools
-lsp
-;; ...
-:lang
-(haskell +lsp)
-```
-
-then do `$HOME/.emacs.d/bin/doom sync`
-
-#### [Spacemacs](https://github.com/syl20bnr/spacemacs)
-
-Manual installation of packages is not required.
-Enable the `haskell` layer and the `lsp` layer in your Spacemacs config file:
-
-```emacs-lisp
-dotspacemacs-configuration-layers
-  '(
-    haskell
-    lsp
-    ;; ...
-  )
-```
-
-### [Kakoune](https://github.com/mawww/kakoune)
-
-1. Grab a copy of [kak-lsp](https://github.com/ul/kak-lsp), and follow the setup instructions.
-2. Point your `kak-lsp.toml` to `haskell-language-server-wrapper`.
-
-```toml
-[language.haskell]
-filetypes = ["haskell"]
-roots = ["Setup.hs", "stack.yaml", "*.cabal"]
-command = "haskell-language-server-wrapper"
-args = ["--lsp"]
-```
-
-## Known limitations
-
-### Limited GHC 9 Support
-Currently, GHC 9 support in HLS is in beta stage; some features are unavailable with GHC >= 9.0.1 for the time being.
-This situation is expected to be resolved in the near future after all the dependent packages support GHC 9.
-See issue [#297](https://github.com/haskell/haskell-language-server/issues/297) for the supported features in GHC 9 and the status of migration progress.
-
-### Preprocessor
-HLS is not yet able to find project preprocessors, which may result in `could not execute: <preprocessor>` errors. This problem is
-tracked in https://github.com/haskell/haskell-language-server/issues/176 and originally comes from https://github.com/mpickering/hie-bios/issues/125
-
-As a workaround, you need to ensure the preprocessor is available in the path (install globally with Stack or Cabal, provide in `shell.nix`, etc.).
-
-Example with `tasty-discover`:
-
-```haskell
-{-# OPTIONS_GHC -F -pgmF tasty-discover #-}
-```
-
-This returns an error in HLS if 'tasty-discover' is not in the path: `could not execute: tasty-discover`.
-
-## Troubleshooting
-
-### Common issues
-
-#### Difficulties with Stack and `Paths_` modules
-
-These are known to be somewhat buggy at the moment: <https://github.com/haskell/haskell-language-server/issues/478>.
-This issue should be fixed in Stack versions >= 2.5.
-
-#### Problems with dynamic linking
-
-As haskell-language-server prebuilt binaries are statically linked, they don't play well with projects using dynamic linking.
-An usual symptom is the presence of errors containing `unknown symbol` and it is typical in arch linux, where a dynamically linked version of ghc is used.
-
-The workaround is to use a version of haskell-language-server compiled from source with `-dynamic` enabled`. See more details [here](https://github.com/haskell/haskell-language-server/issues/1160#issuecomment-756566273).
-
-### Troubleshooting the server
-
-#### Diagnostic mode
-
-The `haskell-language-server` executable can be run in diagnostic mode, where it will just try to load modules from your project, printing all of its output to stdout.
-This makes it much easier to see what's going on and to diagnose build-related problems.
-
-To do this, simply run the executable directly from your shell in the project root.
-You can either run it without an argument, in which case it will load random modules, or with a path, in which case it will load modules in that file or directory.
-
-#### Examining the log
-
-Most clients will launch `haskell-language-server` with `--logfile` to make it write a log file.
-Please consult the documentation for your client to find out where this is (or how to set it).
-
-The log will contain all the messages that are sent to the server and its responses.
-This is helpful for low-level debugging: if you expect a certain action to happen, you can look in the log to see if the corresponding messages are
-sent, or if there are any errors.
-
-To get a more verbose, also pass `--debug` to the executable.
-
-### Troubleshooting the client
-
-Many clients provide diagnostic information about a LSP session.
-In particular, look for a way to get the status of the server, the server stderr, or a log of the messages that the client has sent to the server.
-For example, `lsp-mode` provides all of these (see its [troubleshooting page](https://emacs-lsp.github.io/lsp-mode/page/troubleshooting/) for details).
-
-The most common client-related problem is the client simply not finding the server executable, so make sure that you have the right `PATH` and you have configured
-it to look for the right executable.
-
-## Contributing
-
-:heart: The Haskell tooling dream is near, we need your help! :heart:
-
-- Join [our IRC channel](https://web.libera.chat/?channels=#haskell-language-server) at `#haskell-language-server` on [`libera`](https://libera.chat/).
-
-### Style guidelines
-
-The project includes a [`.editorconfig`](https://editorconfig.org) [file](https://github.com/haskell/haskell-language-server/blob/master/.editorconfig) with the editor basic settings used by the project.
-However, most editors will need some action to honour those settings automatically.
-For example vscode needs to have installed a specific [extension](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig).
-Please, try to follow those basic settings to keep the codebase as uniform as possible.
-
-### Building haskell-language-server
-
-The project can be built with both `cabal build` and `stack build`.
-
-haskell-language-server can also be used with itself. We provide preset samples of `hie.yaml` for Cabal and Stack.
-
-Note: the `./install/` folder is not directly tied to the project so it has dedicated `./install/hie.yaml.[cbl|stack]`
-templates.
-
-#### Using Cabal
-
-```shell
-$ cp hie-cabal.yaml hie.yaml
-$ cp install/hie-cabal.yaml install/hie.yaml
-```
-
-#### Using Stack
-
-```shell
-$ cp hie-stack.yaml hie.yaml
-$ cp install/hie-stack.yaml install/hie.yaml
-$ cp ghcide/hie-stack.yaml ghcide/hie.yaml
-$ stack build --test --no-run-tests
-$ cd install
-$ stack build
-```
-
-#### Using Nix
-
-The instructions below show how to set up a Cachix binary cache and open a nix shell for local development.
-
-```shell
-$ cachix use haskell-language-server
-$ nix-shell
-$ cabal update
-$ cabal build
-```
-
-##### Flakes support
-
-If you are using nix 2.4 style command (enabled by `experimental-features = nix-command`),
-you can use `nix develop` instead of `nix-shell` to enter the development shell. To enter the shell with specific GHC versions:
-
-* `nix develop` or `nix develop .#haskell-language-server-dev` - default GHC version
-* `nix develop .#haskell-language-server-8104-dev` - GHC 8.10.4
-* `nix develop .#haskell-language-server-884-dev` - GHC 8.8.4
-* `nix develop .#haskell-language-server-901-dev` - GHC 9.0.1
-
-If you are looking for a Nix expression to create haskell-language-server binaries, see https://github.com/haskell/haskell-language-server/issues/122
-
-To create binaries:
-
-* `nix build` or `nix build .#haskell-language-server` - default GHC version
-* `nix build .#haskell-language-server-8104` - GHC 8.10.4
-* `nix build .#haskell-language-server-884` - GHC 8.8.4
-* `nix build .#haskell-language-server-901` - GHC 9.0.1
-
-GHC 8.6.5 is not supported here because `nixpkgs-unstable` no longer maintains the corresponding packages set.
-
-#### Introduction tutorial
-
-Pepeiborra [wrote an tutorial](https://github.com/pepeiborra/hls-tutorial) on writing a plugin in HLS.
-
-#### Test your hacked HLS in your editor
-
-If you want to test HLS while hacking on it, follow the steps below.
-
-To do once:
-
-- Open some codebase on which you want to test your hacked HLS in your favorite editor
-- Configure this editor to use your custom HLS executable
-  - With Cabal:
-    - On Unix systems: `cabal exec which haskell-language-server`
-    - On Windows: `cabal exec where haskell-language-server`
-  - With Stack: `$(stack path --dist-dir)/build/haskell-language-server/haskell-language-server`
-
-To do every time you changed code and want to test it:
-
-- Build HLS
-  - With Cabal: `cabal build exe:haskell-language-server`
-  - With Stack: `stack build haskell-language-server:exe:haskell-language-server`
-- Restart HLS
-  - With VS Code: `Haskell: Restart Haskell LSP Server`
-
-### Adding support for a new editor
+[github-release]:https://github.com/haskell/haskell-language-server/releases/latest
 
-Adding support for new editors is fairly easy if the editor already has good support for generic LSP-based extensions.
-In that case, there will likely be an editor-specific support system for this (like `lsp-mode` for Emacs).
-This will typically provide instructions for how to support new languages.
+The official Haskell language server (LSP) implementation. Consult the [project documentation](https://haskell-language-server.readthedocs.io/en/latest/) for more details.
 
-In some cases you may need to write a small bit of additional client support, or expose a way for the user to set the server's [configuration options](#configuring-haskell-language-server) and
-for them to configure how the server is started.
+- [Features](https://haskell-language-server.readthedocs.io/en/latest/features.html)
+- [Installation](https://haskell-language-server.readthedocs.io/en/latest/installation.html)
+- [Configuration](https://haskell-language-server.readthedocs.io/en/latest/configuration.html)
+- [Troubleshooting](https://haskell-language-server.readthedocs.io/en/latest/troubleshooting.html)
+- [Contributing](https://haskell-language-server.readthedocs.io/en/latest/contributing/index.html)
diff --git a/exe/Plugins.hs b/exe/Plugins.hs
--- a/exe/Plugins.hs
+++ b/exe/Plugins.hs
@@ -37,6 +37,10 @@
 import           Ide.Plugin.RefineImports          as RefineImports
 #endif
 
+#if rename
+import           Ide.Plugin.Rename                 as Rename
+#endif
+
 #if retrie
 import           Ide.Plugin.Retrie                 as Retrie
 #endif
@@ -114,6 +118,9 @@
 #endif
 #if stylishHaskell
       StylishHaskell.descriptor "stylish-haskell" :
+#endif
+#if rename
+      Rename.descriptor "rename" :
 #endif
 #if retrie
       Retrie.descriptor "retrie" :
diff --git a/haskell-language-server.cabal b/haskell-language-server.cabal
--- a/haskell-language-server.cabal
+++ b/haskell-language-server.cabal
@@ -1,7 +1,7 @@
 cabal-version:      2.4
 category:           Development
 name:               haskell-language-server
-version:            1.3.0.0
+version:            1.4.0.0
 synopsis:           LSP server for GHC
 description:
   Please see the README on GitHub at <https://github.com/haskell/haskell-language-server#readme>
@@ -14,7 +14,7 @@
 license:            Apache-2.0
 license-file:       LICENSE
 build-type:         Simple
-tested-with:        GHC == 8.6.4 || == 8.6.5 || == 8.8.3 || == 8.8.4 || == 8.10.2 || == 8.10.3 || == 8.10.4 || == 8.10.5
+tested-with:        GHC == 8.6.4 || == 8.6.5 || == 8.8.3 || == 8.8.4 || == 8.10.2 || == 8.10.3 || == 8.10.4 || == 8.10.5 || == 8.10.6
 extra-source-files:
   README.md
   ChangeLog.md
@@ -131,6 +131,11 @@
   default:     True
   manual:      True
 
+flag rename
+  description: Enable rename plugin
+  default:     False
+  manual:      True
+
 flag retrie
   description: Enable retrie plugin
   default:     True
@@ -223,6 +228,11 @@
     build-depends: hls-refine-imports-plugin ^>=1.0.0.0
     cpp-options: -DrefineImports
 
+common rename
+  if flag(rename) || flag(all-plugins)
+    build-depends: hls-rename-plugin ^>= 1.0.0.0
+    cpp-options: -Drename
+
 common retrie
   if flag(retrie) || flag(all-plugins)
     build-depends: hls-retrie-plugin ^>=1.0.0.1
@@ -230,7 +240,7 @@
 
 common tactic
   if flag(tactic) || flag(all-plugins)
-    build-depends: hls-tactics-plugin >=1.2.0.0 && <1.4
+    build-depends: hls-tactics-plugin >=1.2.0.0 && <1.5
     cpp-options: -Dtactic
 
 common hlint
@@ -290,6 +300,7 @@
                     , eval
                     , importLens
                     , refineImports
+                    , rename
                     , retrie
                     , tactic
                     , hlint
@@ -439,7 +450,6 @@
     Highlight
     Progress
     Reference
-    Rename
     Symbol
     TypeDefinition
     Test.Hls.Command
@@ -462,6 +472,8 @@
     cpp-options: -Deval
   if flag(importLens) || flag(all-plugins)
     cpp-options: -DimportLens
+  if flag(rename) || flag(all-plugins)
+    cpp-options: -Drename
   if flag(retrie) || flag(all-plugins)
     cpp-options: -Dretrie
   if flag(tactic) || flag(all-plugins)
diff --git a/src/Ide/Arguments.hs b/src/Ide/Arguments.hs
--- a/src/Ide/Arguments.hs
+++ b/src/Ide/Arguments.hs
@@ -30,6 +30,7 @@
 data Arguments
   = VersionMode PrintVersion
   | ProbeToolsMode
+  | ListPluginsMode
   | BiosMode BiosAction
   | Ghcide GhcideArguments
   | VSCodeExtensionSchemaMode
@@ -64,6 +65,7 @@
     opts = info ((
       VersionMode <$> printVersionParser exeName
       <|> probeToolsParser exeName
+      <|> listPluginsParser
       <|> BiosMode <$> biosParser
       <|> Ghcide <$> arguments plugins
       )
@@ -89,6 +91,11 @@
 probeToolsParser exeName =
   flag' ProbeToolsMode
     (long "probe-tools" <> help ("Show " ++ exeName  ++ " version and other tools of interest"))
+
+listPluginsParser :: Parser Arguments
+listPluginsParser =
+  flag' ListPluginsMode
+    (long "list-plugins" <> help "List all avaliable plugins")
 
 arguments :: IdePlugins IdeState -> Parser GhcideArguments
 arguments plugins = GhcideArguments
diff --git a/src/Ide/Main.hs b/src/Ide/Main.hs
--- a/src/Ide/Main.hs
+++ b/src/Ide/Main.hs
@@ -13,6 +13,7 @@
 import qualified Data.Aeson.Encode.Pretty      as A
 import qualified Data.ByteString.Lazy.Char8    as LBS
 import           Data.Default
+import           Data.List                     (sort)
 import qualified Data.Text                     as T
 import           Development.IDE.Core.Rules
 import           Development.IDE.Graph         (ShakeOptions (shakeThreads))
@@ -25,7 +26,8 @@
 import           Ide.Logger
 import           Ide.Plugin.ConfigUtils        (pluginsToDefaultConfig,
                                                 pluginsToVSCodeExtensionSchema)
-import           Ide.Types                     (IdePlugins, ipMap)
+import           Ide.Types                     (IdePlugins, PluginId (PluginId),
+                                                ipMap)
 import           Ide.Version
 import qualified Language.LSP.Server           as LSP
 import qualified System.Directory.Extra        as IO
@@ -50,6 +52,12 @@
 
         VersionMode PrintNumericVersion ->
             putStrLn haskellLanguageServerNumericVersion
+
+        ListPluginsMode -> do
+            let pluginNames = sort
+                    $ map ((\(PluginId t) -> T.unpack t) . fst)
+                    $ ipMap idePlugins
+            mapM_ putStrLn pluginNames
 
         BiosMode PrintCradleType -> do
             dir <- IO.getCurrentDirectory
diff --git a/test/functional/Completion.hs b/test/functional/Completion.hs
--- a/test/functional/Completion.hs
+++ b/test/functional/Completion.hs
@@ -121,6 +121,31 @@
          compls <- getCompletions doc (Position 5 7)
          liftIO $ length compls @?= maxCompletions def
 
+     , testCase "import function completions" $ runSession hlsCommand fullCaps "test/testdata/completion" $ do
+         doc <- openDoc "FunctionCompletions.hs" "haskell"
+
+         let te = TextEdit (Range (Position 0 30) (Position 0 41)) "A"
+         _ <- applyEdit doc te
+
+         compls <- getCompletions doc (Position 0 31)
+         let item = head $ filter ((== "Alternative") . (^. label)) compls
+         liftIO $ do
+             item ^. label @?= "Alternative"
+             item ^. kind @?= Just CiFunction
+             item ^. detail @?= Just "Control.Applicative"
+
+    , testCase "import second function completion" $ runSession hlsCommand fullCaps "test/testdata/completion" $ do
+         doc <- openDoc "FunctionCompletions.hs" "haskell"
+
+         let te = TextEdit (Range (Position 0 41) (Position 0 42)) ", l"
+         _ <- applyEdit doc te
+
+         compls <- getCompletions doc (Position 0 41)
+         let item = head $ filter ((== "liftA") . (^. label)) compls
+         liftIO $ do
+             item ^. label @?= "liftA"
+             item ^. kind @?= Just CiFunction
+             item ^. detail @?= Just "Control.Applicative"
      , contextTests
      , snippetTests
     ]
diff --git a/test/functional/FunctionalCodeAction.hs b/test/functional/FunctionalCodeAction.hs
--- a/test/functional/FunctionalCodeAction.hs
+++ b/test/functional/FunctionalCodeAction.hs
@@ -9,7 +9,7 @@
 import           Data.Aeson
 import qualified Data.HashMap.Strict             as HM
 import           Data.List
-import qualified Data.Map as M
+import qualified Data.Map                        as M
 import           Data.Maybe
 import qualified Data.Text                       as T
 import           Ide.Plugin.Config
@@ -527,31 +527,29 @@
         _     <- waitForDiagnosticsFrom doc
         diags <- getCurrentDiagnostics doc
         let params = CodeActionParams Nothing Nothing doc (Range (Position 1 0) (Position 4 0)) caContext
-            caContext = CodeActionContext (List diags) (Just (List [CodeActionRefactorInline]))
+            caContext = CodeActionContext (List diags) (Just (List [CodeActionRefactor]))
             caContextAllActions = CodeActionContext (List diags) Nothing
         -- Verify that we get code actions of at least two different kinds.
-        ResponseMessage _ _ (Right (List allCodeActions))
+        ResponseMessage _ _ (Right (List res))
           <- request STextDocumentCodeAction (params & L.context .~ caContextAllActions)
         liftIO $ do
-            redundantId <- inspectCodeAction allCodeActions ["Redundant id"]
-            redundantId ^. L.kind @?= Just CodeActionQuickFix
-            unfoldFoo <- inspectCodeAction allCodeActions ["Unfold foo"]
-            unfoldFoo ^. L.kind @?= Just CodeActionRefactorInline
+            let cas = map fromAction res
+                kinds = map (^. L.kind) cas
+            nub kinds @?= [Just CodeActionRefactorInline, Just CodeActionRefactorExtract, Just CodeActionQuickFix]
         -- Verify that that when we set the only parameter, we only get actions
         -- of the right kind.
         ResponseMessage _ _ (Right (List res)) <- request STextDocumentCodeAction params
-        let cas = map fromAction res
-            kinds = map (^. L.kind) cas
         liftIO $ do
-            not (null kinds) @? "We found an action of kind RefactorInline"
-            all (Just CodeActionRefactorInline ==) kinds @? "All CodeActionRefactorInline"
+            let cas = map fromAction res
+                kinds = map (^. L.kind) cas
+            nub kinds @?= nub [Just CodeActionRefactorInline, Just CodeActionRefactorExtract]
     ]
 
 expectFailIfGhc9 :: String -> TestTree -> TestTree
 expectFailIfGhc9 reason =
   case ghcVersion of
     GHC90 -> expectFailBecause reason
-    _ -> id
+    _     -> id
 
 disableWingman :: Session ()
 disableWingman =
diff --git a/test/functional/Main.hs b/test/functional/Main.hs
--- a/test/functional/Main.hs
+++ b/test/functional/Main.hs
@@ -14,7 +14,6 @@
 import           Highlight
 import           Progress
 import           Reference
-import           Rename
 import           Symbol
 import           Test.Hls
 import           TypeDefinition
@@ -37,7 +36,6 @@
             , Highlight.tests
             , Progress.tests
             , Reference.tests
-            , Rename.tests
             , Symbol.tests
             , TypeDefinition.tests
             ]
diff --git a/test/functional/Rename.hs b/test/functional/Rename.hs
deleted file mode 100644
--- a/test/functional/Rename.hs
+++ /dev/null
@@ -1,23 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-module Rename (tests) where
-
-import           Test.Hls
-import           Test.Hls.Command
-
-tests :: TestTree
-tests = testGroup "rename" [
-    ignoreTestBecause "no symbol renaming (yet!)" $
-    testCase "works" $
-        runSession hlsCommand fullCaps "test/testdata/rename" $ do
-          doc <- openDoc "Rename.hs" "haskell"
-          rename doc (Position 3 1) "baz" -- foo :: Int -> Int
-          contents <- documentContents doc
-          let expected =
-                  "main = do\n\
-                  \  x <- return $ baz 42\n\
-                  \  return (baz x)\n\
-                  \baz :: Int -> Int\n\
-                  \baz x = x + 1\n\
-                  \bar = (+ 1) . baz\n"
-          liftIO $ contents @?= expected
-    ]
diff --git a/test/testdata/completion/FunctionCompletions.hs b/test/testdata/completion/FunctionCompletions.hs
new file mode 100644
--- /dev/null
+++ b/test/testdata/completion/FunctionCompletions.hs
@@ -0,0 +1,8 @@
+import Control.Applicative (Alternative)
+import qualified Data.List
+
+main :: IO ()
+main = putStrLn "hello"
+
+foo :: Either a b -> Either a b
+foo = id
diff --git a/test/testdata/rename/Rename.hs b/test/testdata/rename/Rename.hs
deleted file mode 100644
--- a/test/testdata/rename/Rename.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-main = do
-  x <- return $ foo 42
-  return (foo x)
-foo :: Int -> Int
-foo x = x + 1
-bar = (+ 1) . foo
diff --git a/test/utils/Test/Hls/Flags.hs b/test/utils/Test/Hls/Flags.hs
--- a/test/utils/Test/Hls/Flags.hs
+++ b/test/utils/Test/Hls/Flags.hs
@@ -39,6 +39,14 @@
 requiresImportLensPlugin      = ignoreTestBecause "ImportLens plugin disabled"
 #endif
 
+-- | Disable test unless the rename flag is set
+requiresRenamePlugin          :: TestTree -> TestTree
+#if rename
+requiresRenamePlugin          = id
+#else
+requiresRenamePlugin          = ignoreTestBecause "Rename plugin disabled"
+#endif
+
 -- | Disable test unless the retrie flag is set
 requiresRetriePlugin          :: TestTree -> TestTree
 #if retrie
