Текстовый редактор 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.

Редактирования файлов проекта Рекурсия Несколько окон с кодом Сообщения GHC после :w