/vim-ormolu

Plugin for formatting Haskell source code

Primary LanguageVim scriptMIT LicenseMIT

vim-ormolu

Introduction

This is a plugin to integrate ormolu or fourmolu into your vim workflow. It will run ormolu on Haskell buffers every time they are saved similar to gofmt. It requires ormolu be accessible from your $PATH.

Installation

First install ormolu via Cabal, Stack or Nix:

$ stack install ormolu --resolver=lts-15.10   # via stack
$ cabal new-install ormolu --installdir=/home/user/.local/bin # via cabal
$ nix-build -A ormolu   # via nix

If you are using pathogen.vim unpack this repository into your vim or neovim configuration directory.

$ cd ~/.vim/bundle         # for vim
$ cd ~/.config/nvim/bundle # for neovim
$ git clone https://github.com/sdiehl/vim-ormolu.git

If you are using Vundle add the following to your configuration file:

"Haskell Formatting
Plugin 'sdiehl/vim-ormolu'

If you are using vim-plug add the following to your configuration file:

"Haskell Formatting
Plug 'sdiehl/vim-ormolu'

Configuration

The default settings will work fine out of the box without any aditional configuration.

If you have a non-standard $PATH then set g:ormolu_command Vim variable to the location of the ormolu binary. For example if you want to use fourmolu instead pass this as the argument.

let g:ormolu_command="fourmolu"

When using fourmolu with a configuration file, fourmolu prefixes output with a "Loaded config from: ..." message. In order to prevent this from being included in the reformatted file, set

let g:ormolu_suppress_stderr=1

The specific flags for Ormolu can be configured by changing the Vim variable g:ormolu_options. For example to use faster and unsafe formatting:

let g:ormolu_options=["--unsafe"]

To disable the formatting on a specific buffer use let b:ormolu_disable=1.

To disable the formatting globally use let g:ormolu_disable=1.

If instead of formatting on save, you wish to bind formatting to a specific keypress add the following to your .vimrc or init.vim. For example to bind file formatting to the key sequence tf use:

nnoremap tf :call RunOrmolu()<CR>

To toggle Ormolu formatting on a buffer to use:

nnoremap to :call ToggleOrmolu()<CR>

To disable Ormolu formatting to td use:

nnoremap td :call DisableOrmolu()<CR>

To enable Ormolu formatting to te use:

nnoremap te :call EnableOrmolu()<CR>

To format a visual block range call OrmoluBlock() function. Ormolu doesn't normally work this way and usually requires more context on the module to format. So this feature is experimental and may not function as expected. For example to bind to the key sequence tb use:

xnoremap tb :<c-u>call OrmoluBlock()<CR>

If you see quirky behavior using TypeApplications extensions with the code being formatted into invalid Haskell, you probably need to enable -XTypeApplications globally because it is set in your global cabal file per this issue.

let g:ormolu_options=["-o -XTypeApplications"]

To manually install the formatter on a specific file extension invoke RunOrmolu() as a BufWritePre hook.

autocmd BufWritePre *.hs :call RunOrmolu()

To run formatting inside an unsaved buffer as a scratchpad, set your buffer's filetype to haskell and then invoke any of the formatter commands (i.e. :call RunOrmolu()) or bind it key sequence as above.

set filetype=haskell

License

MIT License Copyright (c) 2019-2020, Stephen Diehl