{-# LANGUAGE QuasiQuotes #-}
module Hledger.Cli.Commands.Help (
helpmode
,help'
) where
import Prelude ()
import Prelude.Compat
import Data.Char
import Data.List
import Data.Maybe
import Data.String.Here
import Safe
import System.Console.CmdArgs.Explicit
import System.Environment
import System.IO
import Hledger.Data.RawOptions
import Hledger.Data.Types
import Hledger.Cli.CliOptions
import Hledger.Cli.DocFiles
helpmode = (defCommandMode $ ["help"] ++ aliases) {
modeHelp = "show any of the hledger manuals, choosing the most suitable viewer (info, man, a pager, or stdout). With no argument, list the manuals." `withAliases` aliases
,modeGroupFlags = Group {
groupUnnamed = [
flagNone ["info"] (setboolopt "info") "show the manual with info"
,flagNone ["man"] (setboolopt "man") "show the manual with man"
,flagNone ["pager"] (setboolopt "pager") "show the manual with $PAGER or less"
,flagNone ["cat"] (setboolopt "cat") "show the manual on stdout"
,flagNone ["help","h"] (setboolopt "help") "show this help"
]
,groupHidden = []
,groupNamed = []
}
,modeArgs = ([], Just $ argsFlag "[MANUAL]")
}
where aliases = []
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
topic = case args of
[pat] -> headMay [t | t <- docTopics, map toLower pat `isInfixOf` t]
_ -> Nothing
[info, man, pager, cat] =
[runInfoForTopic, runManForTopic, runPagerForTopic pagerprog, printHelpForTopic]
viewer
| boolopt "info" $ rawopts_ opts = info
| boolopt "man" $ rawopts_ opts = man
| boolopt "pager" $ rawopts_ opts = pager
| boolopt "cat" $ rawopts_ opts = cat
| not interactive = cat
| "info" `elem` exes = info
| "man" `elem` exes = man
| pagerprog `elem` exes = pager
| otherwise = cat
case topic of
Nothing -> putStrLn $ [here|
Please choose a manual by typing "hledger help MANUAL" (any substring is ok).
A viewer (info, man, a pager, or stdout) will be auto-selected,
or type "hledger help -h" to see options. Manuals available:
|] ++ "\n " ++ intercalate " " docTopics
Just t -> viewer t