Home

Awesome

cabal-fmt

Synopsis

$ cabal install cabal-fmt
$ ...
$ cabal-fmt --inplace example.cabal

Output

Turns this...

cabal-version: 2.4
name: cabal-fmt
version: 0

-- An example formatter
executable cabal-fmt
    default-language: Haskell2010
    hs-source-dirs: src 
    main-is: CabalFmt.hs
    -- build depends will be in
    -- a nice tabular format
    build-depends: base >=4.11 && <4.13, pretty >=1.1.3.6 && <1.2, bytestring, Cabal ^>=2.5, containers ^>=0.5.11.0 || ^>=0.6.0.1
    -- extensions will be sorted
    other-extensions:
      DeriveFunctor FlexibleContexts ExistentialQuantification OverloadedStrings
      RankNTypes

...into this:

cabal-version: 2.4
name:          cabal-fmt
version:       0

-- An example formatter
executable cabal-fmt
  default-language: Haskell2010
  hs-source-dirs:   src
  main-is:          CabalFmt.hs

  -- build depends will be in
  -- a nice tabular format
  build-depends:
    , base        >=4.11      && <4.13
    , bytestring
    , Cabal       ^>=2.5
    , containers  ^>=0.5.11.0 || ^>=0.6.0.1
    , pretty      >=1.1.3.6   && <1.2

  -- extensions will be sorted
  other-extensions:
    DeriveFunctor
    ExistentialQuantification
    FlexibleContexts
    OverloadedStrings
    RankNTypes

Editor Integration

Emacs

If you have cabal-fmt in your $PATH, you can auto-format .cabal files in your project by putting this in the project directory's .dir-locals.el:

((haskell-cabal-mode
  (eval .
    (add-hook 'before-save-hook
      (lambda () (haskell-mode-buffer-apply-command "cabal-fmt")) nil t))))

Vim

There are currently two options, both requiring cabal-fmt to be in your $PATH: