diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -9,13 +9,14 @@
 
 ## Install
 
-    $ cabal install hindent
-
-You might need to `cabal install happy` if haskell-src-exts complains.
+    $ stack build --copy-bins
 
 ## Usage
 
-    $ hindent
+    hindent is used in a pipeline style:
+
+    $ cat path/to/sourcefile.hs | hindent > outfile.hs
+
     hindent: arguments: --style [fundamental|chris-done|johan-tibell|gibiansky]
 
 ## Emacs
@@ -32,6 +33,8 @@
 To enable it, add the following to your init file:
 
 ```lisp
+(add-to-list 'load-path "/path/to/hindent/elisp")
+(require 'hindent)
 (add-hook 'haskell-mode-hook #'hindent-mode)
 ```
 
@@ -52,6 +55,12 @@
 
 Note that unlike in emacs you have to take care of selecting a sensible buffer region as input to
 hindent yourself. If that is too much trouble you can try [vim-textobj-haskell](https://github.com/gilligan/vim-textobj-haskell) which provides a text object for top level bindings.
+
+## Atom
+
+Basic support is provided through [atom/hindent.coffee](https://github.com/chrisdone/hindent/blob/master/atom/hindent.coffee),
+which adds hindent to atom menu with each available style. Mode should be installed as package into `.atom\packages\${PACKAGE_NAME}`,
+here is simple example of atom [package](https://github.com/Heather/atom-hindent).
 
 ## Contributing your own printer style
 
diff --git a/elisp/hindent.el b/elisp/hindent.el
--- a/elisp/hindent.el
+++ b/elisp/hindent.el
@@ -136,8 +136,8 @@
    ;; Otherwise we just do our line-based hack.
    (t
     (save-excursion
-      (let ((start (or (flet
-                           ((jump ()
+      (let ((start (or (cl-letf
+                           (((symbol-function 'jump) #'(lambda ()
                                   (search-backward-regexp "^[^ \n]" nil t 1)
                                   (cond
                                    ((save-excursion (goto-char (line-beginning-position))
@@ -145,13 +145,13 @@
                                     (jump))
                                    (t (unless (or (looking-at "^-}$")
                                                   (looking-at "^{-$"))
-                                        (point))))))
+                                        (point)))))))
                          (goto-char (line-end-position))
                          (jump))
                        0))
             (end (progn (goto-char (1+ (point)))
-                        (or (flet
-                                ((jump ()
+                        (or (cl-letf
+                                (((symbol-function 'jump) #'(lambda ()
                                        (when (search-forward-regexp "[\n]+[^ \n]" nil t 1)
                                          (cond
                                           ((save-excursion (goto-char (line-beginning-position))
@@ -160,7 +160,7 @@
                                           (t (forward-char -1)
                                              (search-backward-regexp "[^\n ]" nil t)
                                              (forward-char)
-                                             (point))))))
+                                             (point)))))))
                               (jump))
                             (point-max)))))
         (cons start end))))))
diff --git a/hindent.cabal b/hindent.cabal
--- a/hindent.cabal
+++ b/hindent.cabal
@@ -1,5 +1,5 @@
 name:                hindent
-version:             4.5.4
+version:             4.5.5
 synopsis:            Extensible Haskell pretty printer
 description:         Extensible Haskell pretty printer. Both a library and an executable.
                      .
diff --git a/src/HIndent.hs b/src/HIndent.hs
--- a/src/HIndent.hs
+++ b/src/HIndent.hs
@@ -133,7 +133,7 @@
   T.lines $ inp
   where
     cppLine :: Text -> Bool
-    cppLine src = any (`T.isPrefixOf` src) ["#if", "#end", "#else", "#define", "#undef"]
+    cppLine src = any (`T.isPrefixOf` src) ["#if", "#end", "#else", "#define", "#undef", "#elif"]
 
     classify :: Text -> CodeBlock
     classify text = if cppLine text
diff --git a/src/HIndent/Pretty.hs b/src/HIndent/Pretty.hs
--- a/src/HIndent/Pretty.hs
+++ b/src/HIndent/Pretty.hs
@@ -136,8 +136,8 @@
 
     printComment (Just $ srcInfoSpan $ nodeInfoSpan info) comment
   where info = ann ast
- 
 
+
 -- | Pretty print a comment.
 printComment :: MonadState (PrintState s) m => Maybe SrcSpan -> Comment -> m ()
 printComment mayNodespan (Comment inline cspan str) =
@@ -517,7 +517,7 @@
 prettyInfixOp :: MonadState (PrintState s) m => QName NodeInfo -> m ()
 prettyInfixOp x =
   case x of
-    Qual{} -> pretty' x
+    Qual{} -> do write "`"; pretty' x; write "`"
     UnQual _ n ->
       case n of
         Ident _ i -> string ("`" ++ i ++ "`")
@@ -574,8 +574,7 @@
         do pretty left
            write " == "
            pretty right
-      TyPromoted{} ->
-        error "FIXME: No implementation for TyPromoted."
+      ty@TyPromoted{} -> pretty' ty
       TySplice{} ->
         error "FIXME: No implementation for TySplice."
 
@@ -913,8 +912,7 @@
       ClassA _ name types ->
         spaced (pretty name :
                 map pretty types)
-      InfixA{} ->
-        error "FIXME: No implementation for InfixA."
+      i@InfixA{} -> pretty' i
       IParam{} ->
         error "FIXME: No implementation for IParam."
       EqualP _ a b ->
@@ -1207,8 +1205,7 @@
         error "FIXME: No implementation for PatBracket."
       TypeBracket _ _ ->
         error "FIXME: No implementation for TypeBracket."
-      DeclBracket _ _ ->
-        error "FIXME: No implementation for DeclBracket."
+      d@(DeclBracket _ _) -> pretty' d
 
 instance Pretty IPBind where
   prettyInternal x =
diff --git a/src/HIndent/Styles/ChrisDone.hs b/src/HIndent/Styles/ChrisDone.hs
--- a/src/HIndent/Styles/ChrisDone.hs
+++ b/src/HIndent/Styles/ChrisDone.hs
@@ -265,13 +265,17 @@
         flatten f' as = (f',as)
 -- | Lambdas are dependent if they can be.
 exp (Lambda _ ps b) =
-  depend (write "\\")
+  depend (write "\\" >> maybeSpace)
          (do spaced (map pretty ps)
              dependOrNewline
                (write " -> ")
                b
                (indented 1 .
                 pretty))
+  where maybeSpace = case ps of
+                       (PBangPat {}):_ -> space
+                       (PIrrPat {}):_ -> space
+                       _ -> return ()
 exp (Tuple _ boxed exps) =
   depend (write (case boxed of
                    Unboxed -> "(#"
@@ -463,17 +467,15 @@
 
 -- | Make the right hand side dependent if it's flat, otherwise
 -- newline it.
-dependOrNewline :: Printer t ()
-                -> Exp NodeInfo
-                -> (Exp NodeInfo -> Printer t ())
-                -> Printer t ()
+dependOrNewline
+  :: Printer t ()
+  -> Exp NodeInfo
+  -> (Exp NodeInfo -> Printer t ())
+  -> Printer t ()
 dependOrNewline left right f =
-  do if isFlat right
-        then renderDependent
-        else do (small,st) <- isSmall renderDependent
-                if small
-                   then put st
-                   else do left
-                           newline
-                           (f right)
-  where renderDependent = depend left (f right)
+  do (fits,st) <- fitsOnOneLine (depend left (f right))
+     if fits
+        then put st
+        else do left
+                newline
+                (f right)
diff --git a/test/chris-done/expected/20.exp b/test/chris-done/expected/20.exp
new file mode 100644
--- /dev/null
+++ b/test/chris-done/expected/20.exp
@@ -0,0 +1,2 @@
+f = \ ~a -> undefined
+f = \ !a -> undefined
diff --git a/test/chris-done/tests/20.test b/test/chris-done/tests/20.test
new file mode 100644
--- /dev/null
+++ b/test/chris-done/tests/20.test
@@ -0,0 +1,2 @@
+f = \ ~a -> undefined
+f = \ !a -> undefined
diff --git a/test/gibiansky/expected/46.exp b/test/gibiansky/expected/46.exp
new file mode 100644
--- /dev/null
+++ b/test/gibiansky/expected/46.exp
@@ -0,0 +1,7 @@
+type X = '[]
+
+type X = '[Int]
+
+type X = '[Int, String]
+
+a :: (A ∈ B w) => IO w
diff --git a/test/gibiansky/tests/46.test b/test/gibiansky/tests/46.test
new file mode 100644
--- /dev/null
+++ b/test/gibiansky/tests/46.test
@@ -0,0 +1,7 @@
+type X = '[]
+
+type X = '[Int]
+
+type X = '[Int, String]
+
+a :: (A ∈ B w) => IO w
