Не секрет, что хакеры предпочитают использовать текстовые редакторы 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-проекта. Если один пакет зависит от нескольких локальных, можно работать сразу с несколькими и удобно перемещаться по выражениям, объявленных в других файлах и пакетах.

Цели внутри 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.

Предложение линтаю Why not?

Чтобы автоматически исправить текущее выражение, приняв данный совет линта, по-умолчанию доступна команда M-x hl-a (мнемоника: hlint at cursor). Чтобы исправить сразу весь буфер по-умолчанию используется M-x hl-b (мнемоника: hlint buffer).

Стилизация кода

После сохранения буфера, автоматически будут регенерированы не только тэги для “прыжков”, но и проведена небольшая редакция Haskell-файла согласно общепринятому стилю (отступы, сортировка импортируемых модулей, и т.п.).

Автоматические пробелы и сортировка