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-файла согласно общепринятому стилю (отступы, сортировка импортируемых модулей, и т.п.).