Простая и удобная среда разработки Haskell-кода в vim
Текстовый редактор vim/nvim очень хорош!
Разумеется, для такого популярного редактора существует множество модулей, существенно помогающих в разработке программного кода на бесчисленных языках программирования.
В данной короткой заметке я набросаю простой и быстрый вариант рабочего окружения
(нужные модули для vim, их настройка, внешние программы) для
комфортного программирования на Haskell в текстовом редакторе vim или nvim (все
настройки ниже должны быть полностью совместимы как с классическим vim версии 8 и выше,
так и с neovim).
Возможности окружения⌗
Итак, мы планируем использовать vim в терминалке или GUI (разницы нет) и иметь следующие удобства при работе с Haskell-кодом:
- Приятная тёмная цветовая схема редактора
- Статусная строка vim с расширенной информацией о режиме и файле
- Расширенная подсветка синтаксиса языка
- Автоматическое опрашивание фонового GHC на предмет информации о типе Haskell-выражения под курсором, возможных предупреждений и/или ошибок компиляции данного модуля
- Автоматическая генерация начальных уравнений функций для всех конструкторов типа; генерация начального тела функций по сигнатурам и т.п.
- Автодополнение прагм, модулей и имён функций (с их сигнатурами) с помощью фонового GHC
- Автоматическое форматирование и/или стилизация кода через stylish-haskell и/или hindent
- Простое дерево файлов и директорий во вкладке vim для удобной навигации внутри большого проекта
Необходимые программы⌗
Нам понадобятся следующие программы (используем пакеты ОС и корректное окружение
stack
/cabal
.
$ sudo pkg install neovim-qt stack gmake
$ stack install ghc-mod hindent stylish-haskell
Установка нужных модулей для vim⌗
Теперь, когда у нас есть самая свежая версия культового текстового редактора, мы
устанавливаем для него требуемые модули. Для управления модулями vim мы будем
использовать pathogen
, а значит “установка” модуля будет заключаться просто в
клонировании его директории с github (большинство модулей для vim хостятся там).
Последовательно для совершенно ненастроенного nvim (для vim всё происходит в
директории ~/.vim
):
$ mkdir ~/.config/nvim
$ mkdir ~/.config/nvim/autoload
$ mkdir ~/.config/nvim/bundle
$ cd ~/.config/nvim/autoload
$ curl -LSso pathogen.vim https://tpo.pe/pathogen.vim
$ cd ~/.config/nvim/bundle
$ git clone https://github.com/sjl/badwolf/
$ git clone https://github.com/vim-airline/vim-airline
$ git clone https://github.com/neovimhaskell/haskell-vim.git
$ git clone https://github.com/eagletmt/ghcmod-vim
$ git clone https://github.com/eagletmt/neco-ghc
$ git clone https://github.com/scrooloose/nerdtree
$ git clone https://github.com/alx741/vim-hindent
$ git clone https://github.com/alx741/vim-stylishask
$ git clone https://github.com/Shougo/vimproc
Всего девять модулей (первые два – цветовая схема и инфопанель). Внутри vimproc
нужно скомпилить маленькую программку:
$ cd ~/.config/nvim/bundle/vimproc
$ gmake
Настройка vim⌗
Создаём слeдyющую минимальную конфигурацию текстового редактора в файле ~/.config/nvim/init.vim
(для vim это
файл ~/.vimrc
). Если для vim что-либо не подходит, можно выкинуть эту опцию:
" General settings
syntax on
filetype plugin indent on
set nocompatible
set number
set nowrap
set showmode
set tw=80
set smartcase
set smarttab
set smartindent
set autoindent
set softtabstop=2
set shiftwidth=2
set expandtab
set incsearch
set hidden
set mouse=a
" Paste with middle mouse click
vmap <LeftRelease> "*ygv
" Paste with <Shift> + <Insert>
imap <S-Insert> <C-R>*
set clipboard=unnamedplus
set history=1000
set completeopt=menuone,menu,longest
set wildignore+=*\\tmp\\*,*.swp,*.swo,*.zip,.git,.cabal-sandbox
set wildmode=longest,list,full
set wildmenu
set completeopt+=longest
set t_Co=256
" Plugin manager
execute pathogen#infect()
" GUI options
set lines=900 columns=1600
set background=dark
colorscheme badwolf
set guifont=Hack:h15
" haskell-vim (better highlighting & indent)
let g:haskell_enable_quantification = 1 " to enable highlighting of `forall`
let g:haskell_enable_recursivedo = 1 " to enable highlighting of `mdo` and `rec`
let g:haskell_enable_arrowsyntax = 1 " to enable highlighting of `proc`
let g:haskell_enable_pattern_synonyms = 1 " to enable highlighting of `pattern`
let g:haskell_enable_typeroles = 1 " to enable highlighting of type roles
let g:haskell_enable_static_pointers = 1 " to enable highlighting of `static`
let g:haskell_backpack = 1 " to enable highlighting of backpack keywords
" ghc-mod cfg
autocmd BufWritePost *.hs GhcModCheckAndLintAsync
" neco-ghc cfg
let g:haskellmode_completion_ghc = 0
autocmd FileType haskell setlocal omnifunc=necoghc#omnifunc
let g:necoghc_enable_detailed_browse = 1
Это лишь примерный конфиг; см. настройки конкретных модулей.
Использование⌗
Всё готово. Можно открывать любой Haskell-файл и работать.
Команды ghc-mod
начинаются с :GhcMod
, работа стилиста и вывод ошибок/сообщений компилятора
происходят при сохранении файла, дерево директорий вызывается :NERDTree
,
автоподстановка - по C-x C-o
в режиме редактирования. Остальное см. на
страницах модулей и в документации к vim.