hledger-1.50: Hledger/Cli/Commands/Help.hs
{-|
The help command.
|-}
--TODO rename manuals
--TODO substring matching
{-# LANGUAGE PackageImports #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
module Hledger.Cli.Commands.Help (
helpmode
,help'
) where
import Data.Maybe
import Safe (headMay)
import System.Console.CmdArgs.Explicit
import System.Environment
import System.IO
import Hledger.Cli.CliOptions
import Hledger.Cli.DocFiles
import Hledger.Data.RawOptions
import Hledger.Data.Types
import Hledger.Utils (embedFileRelative)
--import Hledger.Utils.Debug
helpmode = hledgerCommandMode
$(embedFileRelative "Hledger/Cli/Commands/Help.txt")
-- The help-* names avoid a clash with the --info and --man flags handled in Cli.hs.
[flagNone ["i"] (setboolopt "help-i") "show the manual with info"
,flagNone ["m"] (setboolopt "help-m") "show the manual with man"
,flagNone ["p"] (setboolopt "help-p") "show the manual with $PAGER or less\n(less is always used if TOPIC is specified)"
]
[(helpflagstitle, helpflags)]
[]
([], Just $ argsFlag "[TOPIC]")
-- | Display the hledger manual in various formats.
-- You can select a docs viewer with one of the `--info`, `--man`, `--pager` flags.
-- Otherwise it will use the first available of: info, man, $PAGER, less, stdout
-- (and always stdout if output is non-interactive).
help' :: CliOpts -> Journal -> IO ()
help' opts _ = do
exes <- likelyExecutablesInPath
pagerprog <- fromMaybe "less" <$> lookupEnv "PAGER"
interactive <- hIsTerminalDevice stdout
let
args = take 1 $ listofstringopt "args" $ rawopts_ opts
mtopic = headMay args
[info, man, pager, cat] =
[runInfoForTopic, runManForTopic, runPagerForTopic, printHelpForTopic]
viewer
| boolopt "help-i" $ rawopts_ opts = info
| boolopt "help-m" $ rawopts_ opts = man
| boolopt "help-p" $ rawopts_ opts = pager
| not interactive = cat
| "info" `elem` exes = info
| "man" `elem` exes = man
| pagerprog `elem` exes = pager
| "less" `elem` exes = pager
| otherwise = cat
viewer "hledger" mtopic