Для haskell есть haskell ide engine (далее hie).Это приблуда которая поддерживает Language Server Protocol и благодаря этому может интегрироваться со множеством редакторов (neovim, atom, emacs, sublime, vs code).
Описана здесь . С помощью одной простой комманды вы можете установить HIE:
nix-env -iA selection --arg selector 'p: { inherit (p) ghc864 ghc863 ghc843; }' -f https://github.com/infinisil/all-hies/tarball/master
Это неплохо работает для cabal 2.4.*
, но не работает для cabal 3.0.*
. Ну и если вы хотите быстрый как ghcid
lsp сервер, то вам надо взять бранч hie-bios
из форка автора.
Перед тем как собирать latest and greatest надо клонировать репо all-hies
и поменять Main.hs файл
diff --git a/src/Main.hs b/src/Main.hs
index 8b2c9b1..f24e1ed 100644
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -223,7 +223,7 @@ nixpkgs :: Repository
nixpkgs = Repository "https://github.com/NixOS/nixpkgs"
hie :: Repository
-hie = Repository "https://github.com/haskell/haskell-ide-engine"
+hie = Repository "https://github.com/mpickering/haskell-ide-engine.git"
-- | Returns the local checkout path to a repository
repoPath :: Repository -> App FilePath
Важно изменить имя репо в первую очередь. Далее следовать инструкциям
Я привожу для примера мои. Важно выполнять их из папки all-hies
.
alias update="$(nix-build --no-out-link update.nix)/bin/update"
update --name bios --revision hie-bios
nix-env -f default.nix -iA bios.selection --arg selector 'p: { inherit (p) ghc865; }'
Если вы вдрун видите при запуске update
ошибку вида
update: /tmp/all-hies-stack2nix18584-0: commitBuffer: invalid argument (invalid character)
Это значит у вас в системе старый glibc-locales. Это лечится:
nix-env -f default.nix -i -A pkgs.glibcLocales
LOCALE_ARCHIVE=~/.nix-profile/lib/locale/locale-archive update --name bios --revision hie-bios
В hie появился конфиг при старте hie-bios
ищет в директории запуска и выше файл hie.yaml
. Нигде толеом нет описания опций поэтому смотрите код hie-bios вот базовый конфиг для cabal
-а
cradle:
cabal: {}
И stack
-а
cradle:
stack
Вообще если конфига нету, то он ищет stack.yaml
и cabal.project
, но делает это по порядку и при наличии stack.yaml
до cabal-а не доходит.
neovim взаимодействует с hie через Language Client plugin. Судя по всему, так можно прикрутить не только hie.
Конфиг neovim-а будет выглядеть как-то так
call plug#begin('~/.local/share/nvim/plugged')
Plug 'autozimu/LanguageClient-neovim', {
\ 'branch': 'next',
\ 'do': 'bash install.sh'
\ }
Plug 'junegunn/fzf'
Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
call plug#end()
" Use deoplete.
let g:deoplete#enable_at_startup = 1
" Required for operations modifying multiple buffers like rename
set hidden
let g:LanguageClient_serverCommands = {
\ 'haskell': ['hie', '--lsp'],
\ }
let g:LanguageClient_rootMarkers = {
\ 'haskell': ['*.cabal'],
\ }
nnoremap <F5> :call LanguageClient_contextMenu()<CR>
" Or map each action separately
nnoremap <silent> K :call LanguageClient#textDocument_hover()<CR>
nnoremap <silent> gd :call LanguageClient#textDocument_definition()<CR>
nnoremap <silent> <F2> :call LanguageClient#textDocument_rename()<CR>
Возможно надо установить поддержку python плагинов.
:help provider-python
Тут список neovim related расширений. Мне из них понравились эти
- Расцветка https://github.com/mhartington/oceanic-next
- Улучшенная подсветка и отступы https://github.com/neovimhaskell/haskell-vim
Может быть такая фигня, что Language Client при загрузке neovim-а будет ругаться типа "Not executable". Надо зайти в диренторю плагина ~/.local/share/nvim/plugged/LanguageClient-neovim/
и проверить что install.sh
выполнимый. Если не помогло, то запустить этот install.sh
ручками. Или глядеть тут
stack не всегда удобно использовать, особенно если проект разбит на несколько частей, каждая из которых находится в отдельном репозитории и имеет свой stack.yaml
.
Когда для сборки есть release.nix
файл, в котором определён set с пакетами вида:
rec {
my-package1 = ...
my-package2 = ...
}
Поднять окружение для сборки этого проекта cabal
-ом довольно легко. Например для my-package1
-а это будет выглядеть так:
nix-shell release.nix -A my-package1.env
Установить cabal
и прочее можно тем же nix
-ом. Например:
nix-env -i cabal-install
Таким образом, полностью рабочее окружение можно поднять установив только nix
.