intero-mode: быстрая настройка Emacs для комфортной работы с Haskell-кодом
Не секрет, что хакеры предпочитают использовать текстовые редакторы emacs или vim. Индивидуальные настройки редактора, скрипты и т.п. при этом могут жить десятилетиями, поскольку являются делом профессиональной привычки.
Для редактирования Haskell-кода в emacs традиционно были пакеты haskell-mode и ghc-mod, однако не
так давно появился замечательный проект intero-mode,
предлагающий хороший функционал “из коробки” и настраивать среду для комфортной работы стало быстрее
и проще.
Установка intero-mode⌗
После добавления MELPA-репозитория пакетов к emacs, установить intero-mode можно, найдя свежую версию
“intero” в M-x package-list-packages.
Конфигурация ~/.emacs⌗
Единественное, что надо добавить в ~/.emacs для активации всего функционала ниже:
(add-hook 'haskell-mode-hook 'intero-mode)
(with-eval-after-load 'intero
(flycheck-add-next-checker 'intero '(warning . haskell-hlint)))
При открытии Haskell-файлов теперь будет использован режим intero. Однако желательно
также установить несколько вспомогательных программ (и прописать их в $PATH)
Установка вспомогательных программ⌗
Для функционала ниже могут понадобиться стайлер, линт и генератор тэгов:
$ stack install stylish-haskell hlint apply-refact hasktags
Переменные окружения⌗
Stack устанавливает бинарные файлы в ~/.local/bin, поэтому важно не забыть добавить эту директорию в
`$PATH', чтобы emacs смог вызывать эти программы. Для csh:
setenv PATH $PATH\:/home/nbrk/.local/bin
Использование⌗
При визите Haskell-буфера режим активируется.
Указание целей в stack-проекте⌗
С помощью M-x intero-targets можно выбрать рабочие цели внутри stack-проекта. Если один пакет зависит от нескольких
локальных, можно работать сразу с несколькими и удобно перемещаться по выражениям, объявленных в других файлах и пакетах.

Интерактивная сессия компилятора⌗
Для запуска ghci над текущим буфером и пакетами, указанными в прошлом пункте, нужно нажать C-c C-l. Переключаться
между кодом и окном ghci можно с C-c C-z.
Прыжки между модулями к декларациям выражений⌗
Чтобы “прыгнуть” на декларацию идентификатора под курсором, достаточно нажать M-.. Чтобы вергуться обратно в стеке
прыжков используется M-,. Само собой, прыжки осуществляются между всеми файлами проекта. Файлы “тэгов”, необходимые
для перемещений (hasktags) регенерируются автоматически при сохранении буфера.
Мнемоника для запоминания: ALT + стрелки влево (назад) и вправо (вперёд, т.е. прыжок).
Авто-дополнение при вводе⌗
При начале набора текста будут появляются варианты автодополнений. Чтобы перемещаться по кандидатам без клавиш стрелок
можно использовать M-n и M-p и C-m (Enter) для выбора. В списке кандидатов можно также выполнять поиск с C-s.

Просмотр типа выражения и инфо⌗
При наведении курсора на отдельное слово (в конец слова) будет показан его тип. С помощью обычного mark (т.е. выделения текста) можно посмотреть тип всего (под)выражения.
Коминация C-c C-i вызовет окно с полной инфо об идентификаторе а-ля :info в ghci.

Авто-генерация сигнатуры⌗
Поскольку intero старается справится у компилятора о типе выражения под курсором, обратно можно получить и сигнатуру.
C-u C-c C-t вставляет тип данного выражения в буфер, на строчку выше курсора.
Просмотр сообщений компилятора⌗
Все сообщения компилятора (советы, варнинги, ошибки) в реальном времени отображаются в текущем буфере: каждое “проблемное” выражение выделяется подчёркиванием (красное – ошибка, жёлтое – варнинг) и отметкой “на полях”. При наведении курсора на подчёркнутое слово появится окошко с подробностями.

Быстро перемещаться между сообщениями компилятора в текущем буфере можно с C-c ! n и C-c ! p. Некоторые
рекомендации компилятора можно автоматически применить к текущему буферу с C-c C-r.
Рефакторинг кода⌗
Если установлен линт, то, помимо отметок от компилятора, в буфере будут помечаться и “советы” со стороны hlint.

Чтобы автоматически исправить текущее выражение, приняв данный совет линта, по-умолчанию доступна команда
M-x hl-a (мнемоника: hlint at cursor). Чтобы исправить сразу весь буфер по-умолчанию используется M-x hl-b
(мнемоника: hlint buffer).
Стилизация кода⌗
После сохранения буфера, автоматически будут регенерированы не только тэги для “прыжков”, но и проведена небольшая редакция Haskell-файла согласно общепринятому стилю (отступы, сортировка импортируемых модулей, и т.п.).
