Skip to content

Instantly share code, notes, and snippets.

@drchaos
Last active October 2, 2019 15:28
Show Gist options
  • Save drchaos/73c3abc39f598ee925f63862a0120b53 to your computer and use it in GitHub Desktop.
Save drchaos/73c3abc39f598ee925f63862a0120b53 to your computer and use it in GitHub Desktop.

Настройка IDE для Haskell.

Для haskell есть haskell ide engine (далее hie).Это приблуда которая поддерживает Language Server Protocol и благодаря этому может интегрироваться со множеством редакторов (neovim, atom, emacs, sublime, vs code).

Установка hie nix-ом работающего с несколькими GHC одновременно - all-hies

Описана здесь . С помощью одной простой комманды вы можете установить 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 появился конфиг при старте hie-bios ищет в директории запуска и выше файл hie.yaml . Нигде толеом нет описания опций поэтому смотрите код hie-bios вот базовый конфиг для cabal

cradle:
  cabal: {}

И stack

cradle:
  stack

Вообще если конфига нету, то он ищет stack.yaml и cabal.project, но делает это по порядку и при наличии stack.yaml до cabal-а не доходит.

Настройка neovim

neovim взаимодействует с hie через Language Client plugin. Судя по всему, так можно прикрутить не только hie.

Установка vim-plug

Настройка Language Client

Конфиг 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 расширений. Мне из них понравились эти

Troubleshooting

Может быть такая фигня, что Language Client при загрузке neovim-а будет ругаться типа "Not executable". Надо зайти в диренторю плагина ~/.local/share/nvim/plugged/LanguageClient-neovim/ и проверить что install.sh выполнимый. Если не помогло, то запустить этот install.sh ручками. Или глядеть тут

Наслаждайтесь.

Разработка в nix-shell без stack

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment