diff --git a/core-program.cabal b/core-program.cabal
--- a/core-program.cabal
+++ b/core-program.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 7e0eff3f9f82d279f562a769a41334fdf5600e0bc7c99d4fd9a09b3ad851a872
+-- hash: 803485247c31b54276f04b6bbfa4aa2c9ef78802a0c00f9dc906ad3c3b5742a1
 
 name:           core-program
-version:        0.2.4.1
+version:        0.2.4.2
 synopsis:       Opinionated Haskell Interoperability
 description:    A library to help build command-line programs, both tools and
                 longer-running daemons.
diff --git a/lib/Core/Program/Arguments.hs b/lib/Core/Program/Arguments.hs
--- a/lib/Core/Program/Arguments.hs
+++ b/lib/Core/Program/Arguments.hs
@@ -494,8 +494,9 @@
         globalOptions = extractGlobalOptions commands
         modes = extractValidModes commands
       in do
-        (possibles,first,remainingArgs) <- splitCommandLine argv
+        (possibles,argv') <- splitCommandLine1 argv
         params1 <- extractor Nothing globalOptions possibles
+        (first,remainingArgs) <- splitCommandLine2 argv'
         (mode,localOptions) <- parseIndicatedCommand modes first
         params2 <- extractor (Just mode) localOptions remainingArgs
         return (Parameters (Just mode) ((<>) params1 params2) emptyMap)
@@ -632,17 +633,32 @@
     k (Command longname _ options) modes = insertKeyValue longname options modes
     k _ modes = modes
 
-splitCommandLine :: [String] -> Either InvalidCommandLine ([String], String, [String])
-splitCommandLine args =
+{-|
+Break the command-line apart in two steps. The first peels off the global
+options, the second below looks to see if there is a command (of fails) and
+if so, whether it has any parameters.
+
+We do it this way so that `parseCommandLine` can pas the global options to
+`extractor` and thence `parsePossibleOptions` to catch --version and
+--help.
+-}
+splitCommandLine1 :: [String] -> Either InvalidCommandLine ([String], [String])
+splitCommandLine1 args =
   let
     (possibles,remainder) = List.span isOption args
-    x = List.uncons remainder
   in
+    if null possibles && null remainder
+        then Left NoCommandFound
+        else Right (possibles,remainder)
+
+splitCommandLine2 :: [String] -> Either InvalidCommandLine (String, [String])
+splitCommandLine2 argv' =
+  let
+    x = List.uncons argv'
+  in
     case x of
-        Just (mode,remainingArgs) -> Right (possibles,mode,remainingArgs)
-        Nothing -> if (List.elem "--help" possibles)
-            then Left (HelpRequest Nothing)
-            else Left NoCommandFound
+        Just (mode,remainingArgs) -> Right (mode,remainingArgs)
+        Nothing -> Left NoCommandFound
 
 --
 -- Environment variable handling
diff --git a/lib/Core/System/Pretty.hs b/lib/Core/System/Pretty.hs
--- a/lib/Core/System/Pretty.hs
+++ b/lib/Core/System/Pretty.hs
@@ -27,6 +27,7 @@
     , sep
     , hsep
     , vsep
+    , fillCat
     , fillSep
     , flatAlt
     , hcat
