85 lines
2.8 KiB
Haskell
85 lines
2.8 KiB
Haskell
{-|
|
|
|
|
The help command.
|
|
|
|
|-}
|
|
--TODO rename manuals
|
|
--TODO substring matching
|
|
|
|
{-# 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
|
|
--import Hledger.Utils.Debug
|
|
|
|
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 = []
|
|
|
|
-- | List or display one of the hledger manuals in various formats.
|
|
-- You can select a docs viewer with one of the `--info`, `--man`, `--pager`, `--cat` 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
|
|
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
|