mirror of
https://github.com/simonmichael/hledger.git
synced 2024-12-27 12:24:43 +03:00
cli, ui, web, api: --info, --man, info & man cmds
This commit is contained in:
parent
1fc34d76f8
commit
42c12fe631
@ -74,12 +74,22 @@ show usage
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-help\f[]
|
||||
show detailed help
|
||||
show manual
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-man\f[]
|
||||
show manual with man
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-info\f[]
|
||||
show manual with info
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-version\f[]
|
||||
show version information
|
||||
show version
|
||||
.RS
|
||||
.RE
|
||||
.SH ENVIRONMENT
|
||||
|
@ -66,10 +66,16 @@ Note: if invoking hledger-api as a hledger subcommand, write `--` before options
|
||||
: show usage
|
||||
|
||||
`--help`
|
||||
: show detailed help
|
||||
: show manual
|
||||
|
||||
`--man`
|
||||
: show manual with man
|
||||
|
||||
`--info`
|
||||
: show manual with info
|
||||
|
||||
`--version`
|
||||
: show version information
|
||||
: show version
|
||||
|
||||
_man_({{
|
||||
|
||||
|
@ -52,10 +52,14 @@ OOPPTTIIOONNSS
|
||||
|
||||
--hh show usage
|
||||
|
||||
----hheellpp show detailed help
|
||||
----hheellpp show manual
|
||||
|
||||
----mmaann show manual with man
|
||||
|
||||
----iinnffoo show manual with info
|
||||
|
||||
----vveerrssiioonn
|
||||
show version information
|
||||
show version
|
||||
|
||||
EENNVVIIRROONNMMEENNTT
|
||||
LLEEDDGGEERR__FFIILLEE sets the default journal file path. If not set, it is
|
||||
|
@ -48,7 +48,7 @@ Usage:
|
||||
hledger-api --swagger
|
||||
print API docs in Swagger 2.0 format
|
||||
hledger-api --version
|
||||
hledger-api --help
|
||||
hledger-api -h|--help|--info
|
||||
|
||||
Options:
|
||||
-f --file FILE use a different input file
|
||||
@ -58,7 +58,9 @@ Options:
|
||||
-p --port PORT use a different TCP port (default: 8001)
|
||||
--version show version
|
||||
-h show usage
|
||||
--help show detailed help
|
||||
--help show manual
|
||||
--man show manual with man
|
||||
--info show manual with info
|
||||
|]
|
||||
|
||||
swaggerSpec :: Swagger
|
||||
@ -72,7 +74,9 @@ main :: IO ()
|
||||
main = do
|
||||
args <- getArgs >>= parseArgsOrExit doc
|
||||
when (isPresent args (shortOption 'h')) $ exitWithUsage doc
|
||||
when (isPresent args (longOption "help")) $ putStr (lookupDocTxt "api") >> exitSuccess
|
||||
when (isPresent args (longOption "help")) $ printHelpForTopic "api" >> exitSuccess
|
||||
when (isPresent args (longOption "man")) $ runManForTopic "api" >> exitSuccess
|
||||
when (isPresent args (longOption "info")) $ runInfoForTopic "api" >> exitSuccess
|
||||
when (isPresent args (longOption "version")) $ putStrLn hledgerApiVersion >> exitSuccess
|
||||
when (isPresent args (longOption "swagger")) $ BL8.putStrLn (encode swaggerSpec) >> exitSuccess
|
||||
let defp = "8001"
|
||||
|
@ -42,8 +42,9 @@ main = do
|
||||
run opts
|
||||
where
|
||||
run opts
|
||||
| "shorthelp" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStr (showModeUsage uimode) >> exitSuccess
|
||||
| "longhelp" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStr (showModeHelp uimode) >> exitSuccess
|
||||
| "h" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStr (showModeUsage uimode) >> exitSuccess
|
||||
| "help" `inRawOpts` (rawopts_ $ cliopts_ opts) = printHelpForTopic (topicForMode uimode) >> exitSuccess
|
||||
| "info" `inRawOpts` (rawopts_ $ cliopts_ opts) = runInfoForTopic (topicForMode uimode) >> exitSuccess
|
||||
| "version" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStrLn prognameandversion >> exitSuccess
|
||||
| "binary-filename" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStrLn (binaryfilename progname)
|
||||
| otherwise = withJournalDoUICommand opts runBrickUi
|
||||
|
@ -75,12 +75,22 @@ show usage
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-help\f[]
|
||||
show detailed help
|
||||
show manual
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-man\f[]
|
||||
show manual with man
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-info\f[]
|
||||
show manual with info
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-version\f[]
|
||||
show version information
|
||||
show version
|
||||
.RS
|
||||
.RE
|
||||
.SS hledger options
|
||||
|
@ -78,10 +78,16 @@ Any QUERYARGS are interpreted as a hledger search query which filters the data.
|
||||
: show usage
|
||||
|
||||
`--help`
|
||||
: show detailed help
|
||||
: show manual
|
||||
|
||||
`--man`
|
||||
: show manual with man
|
||||
|
||||
`--info`
|
||||
: show manual with info
|
||||
|
||||
`--version`
|
||||
: show version information
|
||||
: show version
|
||||
|
||||
## hledger options
|
||||
|
||||
|
@ -56,10 +56,14 @@ OOPPTTIIOONNSS
|
||||
|
||||
--hh show usage
|
||||
|
||||
----hheellpp show detailed help
|
||||
----hheellpp show manual
|
||||
|
||||
----mmaann show manual with man
|
||||
|
||||
----iinnffoo show manual with info
|
||||
|
||||
----vveerrssiioonn
|
||||
show version information
|
||||
show version
|
||||
|
||||
hhlleeddggeerr ooppttiioonnss
|
||||
The following common hledger options should also work:
|
||||
|
@ -43,8 +43,10 @@ hledgerWebMain = do
|
||||
|
||||
runWith :: WebOpts -> IO ()
|
||||
runWith opts
|
||||
| "shorthelp" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStr (showModeUsage webmode) >> exitSuccess
|
||||
| "longhelp" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStr (showModeHelp webmode) >> exitSuccess
|
||||
| "h" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStr (showModeUsage webmode) >> exitSuccess
|
||||
| "help" `inRawOpts` (rawopts_ $ cliopts_ opts) = printHelpForTopic (topicForMode webmode) >> exitSuccess
|
||||
| "man" `inRawOpts` (rawopts_ $ cliopts_ opts) = runManForTopic (topicForMode webmode) >> exitSuccess
|
||||
| "info" `inRawOpts` (rawopts_ $ cliopts_ opts) = runInfoForTopic (topicForMode webmode) >> exitSuccess
|
||||
| "version" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStrLn prognameandversion >> exitSuccess
|
||||
| "binary-filename" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStrLn (binaryfilename progname)
|
||||
| otherwise = do
|
||||
|
@ -114,12 +114,22 @@ show usage
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-help\f[]
|
||||
show detailed help
|
||||
show manual
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-man\f[]
|
||||
show manual with man
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-info\f[]
|
||||
show manual with info
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-version\f[]
|
||||
show version information
|
||||
show version
|
||||
.RS
|
||||
.RE
|
||||
.SS hledger options
|
||||
|
@ -121,10 +121,16 @@ serve them from another server for efficiency, you would set the url with this.
|
||||
: show usage
|
||||
|
||||
`--help`
|
||||
: show detailed help
|
||||
: show manual
|
||||
|
||||
`--man`
|
||||
: show manual with man
|
||||
|
||||
`--info`
|
||||
: show manual with info
|
||||
|
||||
`--version`
|
||||
: show version information
|
||||
: show version
|
||||
|
||||
## hledger options
|
||||
|
||||
|
@ -90,10 +90,14 @@ OOPPTTIIOONNSS
|
||||
|
||||
--hh show usage
|
||||
|
||||
----hheellpp show detailed help
|
||||
----hheellpp show manual
|
||||
|
||||
----mmaann show manual with man
|
||||
|
||||
----iinnffoo show manual with info
|
||||
|
||||
----vveerrssiioonn
|
||||
show version information
|
||||
show version
|
||||
|
||||
hhlleeddggeerr ooppttiioonnss
|
||||
The following common hledger options should also work:
|
||||
|
@ -16,6 +16,8 @@ module Hledger.Cli (
|
||||
module Hledger.Cli.Help,
|
||||
module Hledger.Cli.Histogram,
|
||||
module Hledger.Cli.Incomestatement,
|
||||
module Hledger.Cli.Info,
|
||||
module Hledger.Cli.Man,
|
||||
module Hledger.Cli.Print,
|
||||
module Hledger.Cli.Register,
|
||||
module Hledger.Cli.Stats,
|
||||
@ -41,6 +43,8 @@ import Hledger.Cli.Cashflow
|
||||
import Hledger.Cli.Histogram
|
||||
import Hledger.Cli.Help
|
||||
import Hledger.Cli.Incomestatement
|
||||
import Hledger.Cli.Info
|
||||
import Hledger.Cli.Man
|
||||
import Hledger.Cli.Print
|
||||
import Hledger.Cli.Register
|
||||
import Hledger.Cli.Stats
|
||||
|
@ -22,7 +22,6 @@ module Hledger.Cli.CliOptions (
|
||||
defAddonCommandMode,
|
||||
argsFlag,
|
||||
showModeUsage,
|
||||
showModeHelp,
|
||||
withAliases,
|
||||
|
||||
-- * CLI options
|
||||
@ -54,6 +53,7 @@ module Hledger.Cli.CliOptions (
|
||||
|
||||
-- * Other utils
|
||||
hledgerAddons,
|
||||
topicForMode,
|
||||
|
||||
-- * Tests
|
||||
tests_Hledger_Cli_CliOptions
|
||||
@ -95,8 +95,10 @@ import Hledger.Cli.Version
|
||||
-- | Common help flags: --help, --debug, --version...
|
||||
helpflags :: [Flag RawOpts]
|
||||
helpflags = [
|
||||
flagNone ["h"] (setboolopt "shorthelp") "show general usage or (after command) command usage"
|
||||
,flagNone ["help"] (setboolopt "longhelp") "show detailed help"
|
||||
flagNone ["h"] (setboolopt "h") "show general usage or (after command) command usage"
|
||||
,flagNone ["help"] (setboolopt "help") "show manual"
|
||||
,flagNone ["man"] (setboolopt "man") "show manual with man"
|
||||
,flagNone ["info"] (setboolopt "info") "show manual with info"
|
||||
-- ,flagNone ["browse-args"] (setboolopt "browse-args") "use a web UI to select options and build up a command line"
|
||||
,flagReq ["debug"] (\s opts -> Right $ setopt "debug" s opts) "N" "show increasing amounts of debug output if N is 1-9. With no argument, show level 1"
|
||||
,flagNone ["version"] (setboolopt "version") "show version information"
|
||||
@ -169,7 +171,7 @@ defMode = Mode {
|
||||
,modeGroupFlags = Group {
|
||||
groupNamed = []
|
||||
,groupUnnamed = [
|
||||
flagNone ["h"] (setboolopt "shorthelp") "Show command help."
|
||||
flagNone ["h"] (setboolopt "h") "Show command usage."
|
||||
]
|
||||
,groupHidden = []
|
||||
}
|
||||
@ -230,15 +232,15 @@ showModeUsage :: Mode a -> String
|
||||
showModeUsage = (showText defaultWrap :: [Text] -> String) .
|
||||
(helpText [] HelpFormatDefault :: Mode a -> [Text])
|
||||
|
||||
-- | Get a mode's long help, ready for console output. Currently that
|
||||
-- will be the hledger, hledger-ui, hledger-web or hledger-api man page,
|
||||
-- formatted for 80 columns.
|
||||
showModeHelp :: Mode a -> String
|
||||
showModeHelp m
|
||||
| n == "hledger-ui" = lookupDocTxt "ui"
|
||||
| n == "hledger-web" = lookupDocTxt "web"
|
||||
-- | Get the most appropriate documentation topic for a mode.
|
||||
-- Currently, that is either the hledger, hledger-ui, hledger-web or
|
||||
-- hledger-api manual.
|
||||
topicForMode :: Mode a -> Topic
|
||||
topicForMode m
|
||||
| n == "hledger-ui" = "ui"
|
||||
| n == "hledger-web" = "web"
|
||||
-- | n == "hledger-api" = lookupDocTxt "api" -- hledger-api uses docopt
|
||||
| otherwise = lookupDocTxt "cli"
|
||||
| otherwise = "cli"
|
||||
where n = headDef "" $ modeNames m
|
||||
|
||||
-- | Add command aliases to the command's help string.
|
||||
@ -362,8 +364,8 @@ getCliOpts mode' = do
|
||||
opts <- rawOptsToCliOpts rawopts
|
||||
debugArgs args' opts
|
||||
-- if any (`elem` args) ["--help","-h","-?"]
|
||||
when ("shorthelp" `inRawOpts` rawopts_ opts) $ putStr (showModeUsage mode') >> exitSuccess
|
||||
when ("longhelp" `inRawOpts` rawopts_ opts) $ putStr (showModeHelp mode') >> exitSuccess
|
||||
when ("h" `inRawOpts` rawopts_ opts) $ putStr (showModeUsage mode') >> exitSuccess
|
||||
when ("help" `inRawOpts` rawopts_ opts) $ printHelpForTopic (topicForMode mode') >> exitSuccess
|
||||
return opts
|
||||
where
|
||||
-- | Print debug info about arguments and options if --debug is present.
|
||||
|
@ -1,16 +1,21 @@
|
||||
{-# LANGUAGE TemplateHaskell, OverloadedStrings #-}
|
||||
{-|
|
||||
|
||||
Embedded help files (man pages).
|
||||
Embedded documentation files in various formats, and helpers for viewing them.
|
||||
|
||||
|-}
|
||||
|
||||
module Hledger.Cli.DocFiles (
|
||||
|
||||
docFiles
|
||||
Topic
|
||||
,docFiles
|
||||
,docTopics
|
||||
,lookupDocNroff
|
||||
,lookupDocTxt
|
||||
,lookupDocInfo
|
||||
,printHelpForTopic
|
||||
,runManForTopic
|
||||
,runInfoForTopic
|
||||
|
||||
) where
|
||||
|
||||
@ -18,46 +23,90 @@ import Prelude ()
|
||||
import Prelude.Compat
|
||||
import Data.FileEmbed
|
||||
import Data.String
|
||||
import System.IO
|
||||
import System.IO.Temp
|
||||
import System.Process
|
||||
|
||||
import Hledger.Utils (first3, second3, third3)
|
||||
|
||||
type Topic = String
|
||||
|
||||
-- XXX assumes cwd is the hledger package directory, for now ghci must be run from there
|
||||
docFiles :: IsString a => [(Topic, (a, a))]
|
||||
docFiles :: IsString a => [(Topic, (a, a, a))]
|
||||
docFiles = [
|
||||
("cli",
|
||||
($(embedStringFile $ "../hledger/doc/hledger.1"),
|
||||
$(embedStringFile $ "../hledger/doc/hledger.1.txt")))
|
||||
($(embedStringFile $ "../hledger/doc/hledger.1")
|
||||
,$(embedStringFile $ "../hledger/doc/hledger.1.txt")
|
||||
,$(embedStringFile $ "../hledger/doc/hledger.1.info")
|
||||
))
|
||||
,("ui",
|
||||
($(embedStringFile $ "../hledger-ui/doc/hledger-ui.1"),
|
||||
$(embedStringFile $ "../hledger-ui/doc/hledger-ui.1.txt")))
|
||||
($(embedStringFile $ "../hledger-ui/doc/hledger-ui.1")
|
||||
,$(embedStringFile $ "../hledger-ui/doc/hledger-ui.1.txt")
|
||||
,$(embedStringFile $ "../hledger-ui/doc/hledger-ui.1.info")
|
||||
))
|
||||
,("web",
|
||||
($(embedStringFile $ "../hledger-web/doc/hledger-web.1"),
|
||||
$(embedStringFile $ "../hledger-web/doc/hledger-web.1.txt")))
|
||||
($(embedStringFile $ "../hledger-web/doc/hledger-web.1")
|
||||
,$(embedStringFile $ "../hledger-web/doc/hledger-web.1.txt")
|
||||
,$(embedStringFile $ "../hledger-web/doc/hledger-web.1.info")
|
||||
))
|
||||
,("api",
|
||||
($(embedStringFile $ "../hledger-api/doc/hledger-api.1"),
|
||||
$(embedStringFile $ "../hledger-api/doc/hledger-api.1.txt")))
|
||||
($(embedStringFile $ "../hledger-api/doc/hledger-api.1")
|
||||
,$(embedStringFile $ "../hledger-api/doc/hledger-api.1.txt")
|
||||
,$(embedStringFile $ "../hledger-api/doc/hledger-api.1.info")
|
||||
))
|
||||
,("journal",
|
||||
($(embedStringFile $ "../hledger-lib/doc/hledger_journal.5"),
|
||||
$(embedStringFile $ "../hledger-lib/doc/hledger_journal.5.txt")))
|
||||
($(embedStringFile $ "../hledger-lib/doc/hledger_journal.5")
|
||||
,$(embedStringFile $ "../hledger-lib/doc/hledger_journal.5.txt")
|
||||
,$(embedStringFile $ "../hledger-lib/doc/hledger_journal.5.info")
|
||||
))
|
||||
,("csv",
|
||||
($(embedStringFile $ "../hledger-lib/doc/hledger_csv.5"),
|
||||
$(embedStringFile $ "../hledger-lib/doc/hledger_csv.5.txt")))
|
||||
($(embedStringFile $ "../hledger-lib/doc/hledger_csv.5")
|
||||
,$(embedStringFile $ "../hledger-lib/doc/hledger_csv.5.txt")
|
||||
,$(embedStringFile $ "../hledger-lib/doc/hledger_csv.5.info")
|
||||
))
|
||||
,("timeclock",
|
||||
($(embedStringFile $ "../hledger-lib/doc/hledger_timeclock.5"),
|
||||
$(embedStringFile $ "../hledger-lib/doc/hledger_timeclock.5.txt")))
|
||||
($(embedStringFile $ "../hledger-lib/doc/hledger_timeclock.5")
|
||||
,$(embedStringFile $ "../hledger-lib/doc/hledger_timeclock.5.txt")
|
||||
,$(embedStringFile $ "../hledger-lib/doc/hledger_timeclock.5.info")
|
||||
))
|
||||
,("timedot",
|
||||
($(embedStringFile $ "../hledger-lib/doc/hledger_timedot.5"),
|
||||
$(embedStringFile $ "../hledger-lib/doc/hledger_timedot.5.txt")))
|
||||
($(embedStringFile $ "../hledger-lib/doc/hledger_timedot.5")
|
||||
,$(embedStringFile $ "../hledger-lib/doc/hledger_timedot.5.txt")
|
||||
,$(embedStringFile $ "../hledger-lib/doc/hledger_timedot.5.info")
|
||||
))
|
||||
]
|
||||
|
||||
docTopics :: [Topic]
|
||||
docTopics = map fst docFiles
|
||||
|
||||
lookupDocNroff :: IsString a => Topic -> a
|
||||
lookupDocNroff name =
|
||||
maybe (fromString $ "No such help topic: "++name) fst $ lookup name docFiles
|
||||
|
||||
lookupDocTxt :: IsString a => Topic -> a
|
||||
lookupDocTxt name =
|
||||
maybe (fromString $ "No such help topic: "++name) snd $ lookup name docFiles
|
||||
maybe (fromString $ "No text manual found for topic: "++name) second3 $ lookup name docFiles
|
||||
|
||||
lookupDocNroff :: IsString a => Topic -> a
|
||||
lookupDocNroff name =
|
||||
maybe (fromString $ "No man page found for topic: "++name) first3 $ lookup name docFiles
|
||||
|
||||
lookupDocInfo :: IsString a => Topic -> a
|
||||
lookupDocInfo name =
|
||||
maybe (fromString $ "No info manual found for topic: "++name) third3 $ lookup name docFiles
|
||||
|
||||
printHelpForTopic :: Topic -> IO ()
|
||||
printHelpForTopic t =
|
||||
putStrLn $ lookupDocTxt t
|
||||
|
||||
runManForTopic :: Topic -> IO ()
|
||||
runManForTopic t =
|
||||
withSystemTempFile ("hledger-"++t++".nroff") $ \f h -> do
|
||||
hPutStrLn h $ lookupDocNroff t
|
||||
hClose h
|
||||
-- the temp file path will presumably have a slash in it, so man should read it
|
||||
callCommand $ "man " ++ f
|
||||
|
||||
runInfoForTopic :: Topic -> IO ()
|
||||
runInfoForTopic t =
|
||||
withSystemTempFile ("hledger-"++t++".info") $ \f h -> do
|
||||
hPutStrLn h $ lookupDocInfo t
|
||||
hClose h
|
||||
callCommand $ "info " ++ f
|
||||
|
||||
|
@ -21,7 +21,7 @@ import Hledger.Cli.CliOptions
|
||||
import Hledger.Cli.DocFiles
|
||||
|
||||
helpmode = (defCommandMode $ ["help"] ++ aliases) {
|
||||
modeHelp = "show detailed help (the main hledger man pages)" `withAliases` aliases
|
||||
modeHelp = "show manual" `withAliases` aliases
|
||||
,modeGroupFlags = Group {
|
||||
groupUnnamed = []
|
||||
,groupHidden = []
|
||||
@ -36,7 +36,7 @@ help' opts = do
|
||||
let args = listofstringopt "args" $ rawopts_ opts
|
||||
case args of
|
||||
[] -> putStrLn $
|
||||
"Choose a topic, eg: hledger help ui\n" ++
|
||||
"Choose a topic, eg: hledger help cli\n" ++
|
||||
intercalate ", " docTopics
|
||||
topic:_ -> putStrLn $ lookupDocTxt topic
|
||||
topic:_ -> printHelpForTopic topic
|
||||
|
||||
|
41
hledger/Hledger/Cli/Info.hs
Normal file
41
hledger/Hledger/Cli/Info.hs
Normal file
@ -0,0 +1,41 @@
|
||||
{-|
|
||||
|
||||
The info command.
|
||||
|
||||
|-}
|
||||
|
||||
module Hledger.Cli.Info (
|
||||
|
||||
infomode
|
||||
,info'
|
||||
|
||||
) where
|
||||
|
||||
import Prelude ()
|
||||
import Prelude.Compat
|
||||
import Data.List
|
||||
import System.Console.CmdArgs.Explicit
|
||||
|
||||
import Hledger.Data.RawOptions
|
||||
import Hledger.Cli.CliOptions
|
||||
import Hledger.Cli.DocFiles
|
||||
|
||||
infomode = (defCommandMode $ ["info"] ++ aliases) {
|
||||
modeHelp = "show manual with info" `withAliases` aliases
|
||||
,modeGroupFlags = Group {
|
||||
groupUnnamed = []
|
||||
,groupHidden = []
|
||||
,groupNamed = []
|
||||
}
|
||||
}
|
||||
where aliases = []
|
||||
|
||||
-- | Try to use info to view the selected manual.
|
||||
info' :: CliOpts -> IO ()
|
||||
info' opts = do
|
||||
let args = listofstringopt "args" $ rawopts_ opts
|
||||
case args of
|
||||
[] -> putStrLn $
|
||||
"Choose a topic, eg: hledger info cli\n" ++
|
||||
intercalate ", " docTopics
|
||||
topic:_ -> runInfoForTopic topic
|
@ -55,9 +55,12 @@ import Hledger.Cli.Accounts
|
||||
import Hledger.Cli.Balance
|
||||
import Hledger.Cli.Balancesheet
|
||||
import Hledger.Cli.Cashflow
|
||||
import Hledger.Cli.DocFiles
|
||||
import Hledger.Cli.Help
|
||||
import Hledger.Cli.Histogram
|
||||
import Hledger.Cli.Incomestatement
|
||||
import Hledger.Cli.Info
|
||||
import Hledger.Cli.Man
|
||||
import Hledger.Cli.Print
|
||||
import Hledger.Cli.Register
|
||||
import Hledger.Cli.Stats
|
||||
@ -100,6 +103,8 @@ mainmode addons = defMode {
|
||||
-- modes in the unnamed group, shown first without a heading:
|
||||
,groupUnnamed = [
|
||||
helpmode
|
||||
,manmode
|
||||
,infomode
|
||||
]
|
||||
-- modes handled but not shown
|
||||
,groupHidden = [
|
||||
@ -247,13 +252,19 @@ main = do
|
||||
hasVersion = ("--version" `elem`)
|
||||
hasDetailedVersion = ("--version+" `elem`)
|
||||
printUsage = putStr $ showModeUsage $ mainmode addonDisplayNames
|
||||
printHelp = putStr $ showModeHelp $ mainmode addonDisplayNames
|
||||
badCommandError = error' ("command "++rawcmd++" is not recognized, run with no command to see a list") >> exitFailure
|
||||
hasShortHelp args = any (`elem` args) ["-h"]
|
||||
hasLongHelp args = any (`elem` args) ["--help"]
|
||||
hasHelp args = hasShortHelp args || hasLongHelp args
|
||||
f `orShowUsage` mode = if hasShortHelp args then putStr (showModeUsage mode) else f
|
||||
f `orShowHelp` mode = if hasLongHelp args then putStr (showModeHelp mode) else f
|
||||
hasShortHelpFlag args = any (`elem` args) ["-h"]
|
||||
hasLongHelpFlag args = any (`elem` args) ["--help"]
|
||||
hasManFlag args = any (`elem` args) ["--man"]
|
||||
hasInfoFlag args = any (`elem` args) ["--info"]
|
||||
hasSomeHelpFlag args = hasShortHelpFlag args || hasLongHelpFlag args || hasManFlag args || hasInfoFlag args
|
||||
f `orShowHelp` mode
|
||||
| hasShortHelpFlag args = putStr $ showModeUsage mode
|
||||
| hasLongHelpFlag args = printHelpForTopic t
|
||||
| hasManFlag args = runManForTopic t
|
||||
| hasInfoFlag args = runInfoForTopic t
|
||||
| otherwise = f
|
||||
where t = topicForMode mode
|
||||
dbgIO "processed opts" opts
|
||||
dbgIO "command matched" cmd
|
||||
dbgIO "isNullCommand" isNullCommand
|
||||
@ -266,31 +277,35 @@ main = do
|
||||
dbgIO "query from opts & args" (queryFromOpts d $ reportopts_ opts)
|
||||
let
|
||||
runHledgerCommand
|
||||
-- high priority flags and situations. --help should be highest priority.
|
||||
| hasShortHelp argsbeforecmd = dbgIO "" "-h before command, showing general usage" >> printUsage
|
||||
| hasLongHelp argsbeforecmd = dbgIO "" "--help before command, showing general help" >> printHelp
|
||||
| not (hasHelp argsaftercmd) && (hasVersion argsbeforecmd || (hasVersion argsaftercmd && isInternalCommand))
|
||||
-- high priority flags and situations. -h, then --help, then --info are highest priority.
|
||||
| hasShortHelpFlag argsbeforecmd = dbgIO "" "-h before command, showing general usage" >> printUsage
|
||||
| hasLongHelpFlag argsbeforecmd = dbgIO "" "--help before command, showing general manual" >> printHelpForTopic (topicForMode $ mainmode addonDisplayNames)
|
||||
| hasManFlag argsbeforecmd = dbgIO "" "--man before command, showing general manual with man" >> runManForTopic (topicForMode $ mainmode addonDisplayNames)
|
||||
| hasInfoFlag argsbeforecmd = dbgIO "" "--info before command, showing general manual with info" >> runInfoForTopic (topicForMode $ mainmode addonDisplayNames)
|
||||
| not (hasSomeHelpFlag argsaftercmd) && (hasVersion argsbeforecmd || (hasVersion argsaftercmd && isInternalCommand))
|
||||
= putStrLn prognameandversion
|
||||
| not (hasHelp argsaftercmd) && (hasDetailedVersion argsbeforecmd || (hasDetailedVersion argsaftercmd && isInternalCommand))
|
||||
| not (hasSomeHelpFlag argsaftercmd) && (hasDetailedVersion argsbeforecmd || (hasDetailedVersion argsaftercmd && isInternalCommand))
|
||||
= putStrLn prognameanddetailedversion
|
||||
-- \| (null externalcmd) && "binary-filename" `inRawOpts` rawopts = putStrLn $ binaryfilename progname
|
||||
-- \| "--browse-args" `elem` args = System.Console.CmdArgs.Helper.execute "cmdargs-browser" mainmode' args >>= (putStr . show)
|
||||
| isNullCommand = dbgIO "" "no command, showing general help" >> printUsage
|
||||
| isNullCommand = dbgIO "" "no command, showing general usage" >> printUsage
|
||||
| isBadCommand = badCommandError
|
||||
|
||||
-- internal commands
|
||||
| cmd == "activity" = withJournalDo opts histogram `orShowUsage` activitymode `orShowHelp` activitymode
|
||||
| cmd == "add" = (journalFilePathFromOpts opts >>= (ensureJournalFileExists . head) >> withJournalDo opts add) `orShowUsage` addmode `orShowHelp` addmode
|
||||
| cmd == "accounts" = withJournalDo opts accounts `orShowUsage` accountsmode `orShowHelp` accountsmode
|
||||
| cmd == "balance" = withJournalDo opts balance `orShowUsage` balancemode `orShowHelp` balancemode
|
||||
| cmd == "balancesheet" = withJournalDo opts balancesheet `orShowUsage` balancesheetmode `orShowHelp` balancesheetmode
|
||||
| cmd == "cashflow" = withJournalDo opts cashflow `orShowUsage` cashflowmode `orShowHelp` cashflowmode
|
||||
| cmd == "incomestatement" = withJournalDo opts incomestatement `orShowUsage` incomestatementmode `orShowHelp` incomestatementmode
|
||||
| cmd == "print" = withJournalDo opts print' `orShowUsage` printmode `orShowHelp` printmode
|
||||
| cmd == "register" = withJournalDo opts register `orShowUsage` registermode `orShowHelp` registermode
|
||||
| cmd == "stats" = withJournalDo opts stats `orShowUsage` statsmode `orShowHelp` statsmode
|
||||
| cmd == "test" = test' opts `orShowUsage` testmode `orShowHelp` testmode
|
||||
| cmd == "help" = help' opts `orShowUsage` helpmode `orShowHelp` helpmode
|
||||
| cmd == "activity" = withJournalDo opts histogram `orShowHelp` activitymode
|
||||
| cmd == "add" = (journalFilePathFromOpts opts >>= (ensureJournalFileExists . head) >> withJournalDo opts add) `orShowHelp` addmode
|
||||
| cmd == "accounts" = withJournalDo opts accounts `orShowHelp` accountsmode
|
||||
| cmd == "balance" = withJournalDo opts balance `orShowHelp` balancemode
|
||||
| cmd == "balancesheet" = withJournalDo opts balancesheet `orShowHelp` balancesheetmode
|
||||
| cmd == "cashflow" = withJournalDo opts cashflow `orShowHelp` cashflowmode
|
||||
| cmd == "incomestatement" = withJournalDo opts incomestatement `orShowHelp` incomestatementmode
|
||||
| cmd == "print" = withJournalDo opts print' `orShowHelp` printmode
|
||||
| cmd == "register" = withJournalDo opts register `orShowHelp` registermode
|
||||
| cmd == "stats" = withJournalDo opts stats `orShowHelp` statsmode
|
||||
| cmd == "test" = test' opts `orShowHelp` testmode
|
||||
| cmd == "help" = help' opts `orShowHelp` helpmode
|
||||
| cmd == "man" = man opts `orShowHelp` manmode
|
||||
| cmd == "info" = info' opts `orShowHelp` infomode
|
||||
|
||||
-- an external command
|
||||
| isExternalCommand = do
|
||||
|
41
hledger/Hledger/Cli/Man.hs
Normal file
41
hledger/Hledger/Cli/Man.hs
Normal file
@ -0,0 +1,41 @@
|
||||
{-|
|
||||
|
||||
The man command.
|
||||
|
||||
|-}
|
||||
|
||||
module Hledger.Cli.Man (
|
||||
|
||||
manmode
|
||||
,man
|
||||
|
||||
) where
|
||||
|
||||
import Prelude ()
|
||||
import Prelude.Compat
|
||||
import Data.List
|
||||
import System.Console.CmdArgs.Explicit
|
||||
|
||||
import Hledger.Data.RawOptions
|
||||
import Hledger.Cli.CliOptions
|
||||
import Hledger.Cli.DocFiles
|
||||
|
||||
manmode = (defCommandMode $ ["man"] ++ aliases) {
|
||||
modeHelp = "show manual with man" `withAliases` aliases
|
||||
,modeGroupFlags = Group {
|
||||
groupUnnamed = []
|
||||
,groupHidden = []
|
||||
,groupNamed = []
|
||||
}
|
||||
}
|
||||
where aliases = []
|
||||
|
||||
-- | Try to use man to view the selected manual.
|
||||
man :: CliOpts -> IO ()
|
||||
man opts = do
|
||||
let args = listofstringopt "args" $ rawopts_ opts
|
||||
case args of
|
||||
[] -> putStrLn $
|
||||
"Choose a topic, eg: hledger man cli\n" ++
|
||||
intercalate ", " docTopics
|
||||
topic:_ -> runManForTopic topic
|
@ -231,18 +231,20 @@ Total:
|
||||
```
|
||||
|
||||
## help
|
||||
Show detailed help.
|
||||
Show one of the hledger manuals.
|
||||
|
||||
The `help` command can display any of the main [hledger man pages](/docs.html), as fixed-width text.
|
||||
The `help` command displays any of the main [hledger man pages](/docs.html).
|
||||
(Unlike `hledger --help`, which displays only the hledger man page.)
|
||||
Run it with no arguments to list available topics (their names are shortened for easier typing),
|
||||
and run `hledger help TOPIC` to select one.
|
||||
The output may be long, so you may wish to pipe it into a pager.
|
||||
The output is similar to a man page, but fixed width.
|
||||
It may be long, so you may wish to pipe it into a pager.
|
||||
See also [info](#info) and [man](#man).
|
||||
|
||||
_shell_({{
|
||||
$ hledger help
|
||||
Please choose a topic, eg: hledger help ui
|
||||
Topics: cli, ui, web, api, journal, csv, timeclock, timedot
|
||||
Choose a topic, eg: hledger help cli
|
||||
cli, ui, web, api, journal, csv, timeclock, timedot
|
||||
}})
|
||||
|
||||
_shell_({{
|
||||
@ -298,6 +300,26 @@ Total:
|
||||
0
|
||||
```
|
||||
|
||||
## info
|
||||
Show one of the hledger manuals using info.
|
||||
|
||||
The `info` command displays any of the [hledger reference manuals](/docs.html)
|
||||
using the [info](https://en.wikipedia.org/wiki/Info_(Unix)) hypertextual documentation viewer.
|
||||
This can be a very efficient way to browse large manuals.
|
||||
It requires the "info" program to be available in your PATH.
|
||||
|
||||
As with [help](#help), run it with no arguments to list available topics (manuals).
|
||||
|
||||
## man
|
||||
Show one of the hledger manuals using man.
|
||||
|
||||
The `man` command displays any of the [hledger reference manuals](/docs.html)
|
||||
using [man](https://en.wikipedia.org/wiki/Man_page), the standard documentation viewer on unix systems.
|
||||
This will fit the text to your terminal width, and probably invoke a pager automatically.
|
||||
It requires the "man" program to be available in your PATH.
|
||||
|
||||
As with [help](#help), run it with no arguments to list available topics (manuals).
|
||||
|
||||
## print
|
||||
Show transactions from the journal.
|
||||
|
||||
|
@ -177,12 +177,23 @@ show general usage (or if after COMMAND, the command\[aq]s usage)
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-help\f[]
|
||||
show detailed help (or if after COMMAND, the command\[aq]s help)
|
||||
show hledger manual (or if after an add\-on COMMAND, show the
|
||||
add\-on\[aq]s manual)
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-man\f[]
|
||||
show manual with man
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-info\f[]
|
||||
show manual with info
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B \f[C]\-\-version\f[]
|
||||
show version information
|
||||
show version
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
@ -1352,21 +1363,22 @@ Total:
|
||||
.fi
|
||||
.SS help
|
||||
.PP
|
||||
Show detailed help.
|
||||
Show one of the hledger manuals.
|
||||
.PP
|
||||
The \f[C]help\f[] command can display any of the main hledger man pages,
|
||||
as fixed\-width text.
|
||||
The \f[C]help\f[] command displays any of the main hledger man pages.
|
||||
(Unlike \f[C]hledger\ \-\-help\f[], which displays only the hledger man
|
||||
page.) Run it with no arguments to list available topics (their names
|
||||
are shortened for easier typing), and run \f[C]hledger\ help\ TOPIC\f[]
|
||||
to select one.
|
||||
The output may be long, so you may wish to pipe it into a pager.
|
||||
The output is similar to a man page, but fixed width.
|
||||
It may be long, so you may wish to pipe it into a pager.
|
||||
See also info and man.
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$\ hledger\ help
|
||||
Please\ choose\ a\ topic,\ eg:\ hledger\ help\ ui
|
||||
Topics:\ cli,\ ui,\ web,\ api,\ journal,\ csv,\ timeclock,\ timedot
|
||||
Choose\ a\ topic,\ eg:\ hledger\ help\ cli
|
||||
cli,\ ui,\ web,\ api,\ journal,\ csv,\ timeclock,\ timedot
|
||||
\f[]
|
||||
.fi
|
||||
.IP
|
||||
@ -1431,6 +1443,29 @@ Total:
|
||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0
|
||||
\f[]
|
||||
.fi
|
||||
.SS info
|
||||
.PP
|
||||
Show one of the hledger manuals using info.
|
||||
.PP
|
||||
The \f[C]info\f[] command displays any of the hledger reference manuals
|
||||
using the info hypertextual documentation viewer.
|
||||
This can be a very efficient way to browse large manuals.
|
||||
It requires the "info" program to be available in your PATH.
|
||||
.PP
|
||||
As with help, run it with no arguments to list available topics
|
||||
(manuals).
|
||||
.SS man
|
||||
.PP
|
||||
Show one of the hledger manuals using man.
|
||||
.PP
|
||||
The \f[C]man\f[] command displays any of the hledger reference manuals
|
||||
using man, the standard documentation viewer on unix systems.
|
||||
This will fit the text to your terminal width, and probably invoke a
|
||||
pager automatically.
|
||||
It requires the "man" program to be available in your PATH.
|
||||
.PP
|
||||
As with help, run it with no arguments to list available topics
|
||||
(manuals).
|
||||
.SS print
|
||||
.PP
|
||||
Show transactions from the journal.
|
||||
|
@ -126,10 +126,15 @@ OOPPTTIIOONNSS
|
||||
|
||||
--hh show general usage (or if after COMMAND, the command's usage)
|
||||
|
||||
----hheellpp show detailed help (or if after COMMAND, the command's help)
|
||||
----hheellpp show hledger manual (or if after an add-on COMMAND, show the
|
||||
add-on's manual)
|
||||
|
||||
----mmaann show manual with man
|
||||
|
||||
----iinnffoo show manual with info
|
||||
|
||||
----vveerrssiioonn
|
||||
show version information
|
||||
show version
|
||||
|
||||
--ff FFIILLEE ----ffiillee==FFIILLEE
|
||||
use a different input file. For stdin, use -
|
||||
@ -937,18 +942,18 @@ CCOOMMMMAANNDDSS
|
||||
$-1
|
||||
|
||||
hheellpp
|
||||
Show detailed help.
|
||||
Show one of the hledger manuals.
|
||||
|
||||
The help command can display any of the main hledger man pages, as
|
||||
fixed-width text. (Unlike hledger --help, which displays only the
|
||||
hledger man page.) Run it with no arguments to list available topics
|
||||
(their names are shortened for easier typing), and run
|
||||
hledger help TOPIC to select one. The output may be long, so you may
|
||||
wish to pipe it into a pager.
|
||||
The help command displays any of the main hledger man pages. (Unlike
|
||||
hledger --help, which displays only the hledger man page.) Run it with
|
||||
no arguments to list available topics (their names are shortened for
|
||||
easier typing), and run hledger help TOPIC to select one. The output
|
||||
is similar to a man page, but fixed width. It may be long, so you may
|
||||
wish to pipe it into a pager. See also info and man.
|
||||
|
||||
$ hledger help
|
||||
Please choose a topic, eg: hledger help ui
|
||||
Topics: cli, ui, web, api, journal, csv, timeclock, timedot
|
||||
Choose a topic, eg: hledger help cli
|
||||
cli, ui, web, api, journal, csv, timeclock, timedot
|
||||
|
||||
$ hledger help cli | less
|
||||
|
||||
@ -997,6 +1002,28 @@ CCOOMMMMAANNDDSS
|
||||
--------------------
|
||||
0
|
||||
|
||||
iinnffoo
|
||||
Show one of the hledger manuals using info.
|
||||
|
||||
The info command displays any of the hledger reference manuals using
|
||||
the info hypertextual documentation viewer. This can be a very effi-
|
||||
cient way to browse large manuals. It requires the "info" program to
|
||||
be available in your PATH.
|
||||
|
||||
As with help, run it with no arguments to list available topics (manu-
|
||||
als).
|
||||
|
||||
mmaann
|
||||
Show one of the hledger manuals using man.
|
||||
|
||||
The man command displays any of the hledger reference manuals using
|
||||
man, the standard documentation viewer on unix systems. This will fit
|
||||
the text to your terminal width, and probably invoke a pager automati-
|
||||
cally. It requires the "man" program to be available in your PATH.
|
||||
|
||||
As with help, run it with no arguments to list available topics (manu-
|
||||
als).
|
||||
|
||||
pprriinntt
|
||||
Show transactions from the journal.
|
||||
|
||||
|
@ -26,10 +26,16 @@ General options are always available and can appear anywhere in the command line
|
||||
: show general usage (or if after COMMAND, the command's usage)
|
||||
|
||||
`--help`
|
||||
: show detailed help (or if after COMMAND, the command's help)
|
||||
: show hledger manual (or if after an add-on COMMAND, show the add-on's manual)
|
||||
|
||||
`--man`
|
||||
: show manual with man
|
||||
|
||||
`--info`
|
||||
: show manual with info
|
||||
|
||||
`--version`
|
||||
: show version information
|
||||
: show version
|
||||
|
||||
`-f FILE --file=FILE`
|
||||
: use a different input file. For stdin, use -
|
||||
|
@ -81,6 +81,7 @@ dependencies:
|
||||
- regex-tdfa
|
||||
- safe >= 0.2
|
||||
- split >= 0.1 && < 0.3
|
||||
- temporary
|
||||
- text >= 0.11
|
||||
- tabular >= 0.2 && < 0.3
|
||||
- utf8-string >= 0.3.5 && < 1.1
|
||||
@ -124,6 +125,7 @@ library:
|
||||
- Hledger.Cli
|
||||
- Hledger.Cli.Main
|
||||
- Hledger.Cli.CliOptions
|
||||
- Hledger.Cli.DocFiles
|
||||
- Hledger.Cli.Tests
|
||||
- Hledger.Cli.Utils
|
||||
- Hledger.Cli.Version
|
||||
@ -132,8 +134,11 @@ library:
|
||||
- Hledger.Cli.Balance
|
||||
- Hledger.Cli.Balancesheet
|
||||
- Hledger.Cli.Cashflow
|
||||
- Hledger.Cli.Help
|
||||
- Hledger.Cli.Histogram
|
||||
- Hledger.Cli.Incomestatement
|
||||
- Hledger.Cli.Info
|
||||
- Hledger.Cli.Man
|
||||
- Hledger.Cli.Print
|
||||
- Hledger.Cli.Register
|
||||
- Hledger.Cli.Stats
|
||||
|
@ -80,6 +80,7 @@ library
|
||||
, regex-tdfa
|
||||
, safe >= 0.2
|
||||
, split >= 0.1 && < 0.3
|
||||
, temporary
|
||||
, text >= 0.11
|
||||
, tabular >= 0.2 && < 0.3
|
||||
, utf8-string >= 0.3.5 && < 1.1
|
||||
@ -122,6 +123,8 @@ library
|
||||
Hledger.Cli.Help
|
||||
Hledger.Cli.Histogram
|
||||
Hledger.Cli.Incomestatement
|
||||
Hledger.Cli.Info
|
||||
Hledger.Cli.Man
|
||||
Hledger.Cli.Print
|
||||
Hledger.Cli.Register
|
||||
Hledger.Cli.Stats
|
||||
@ -158,6 +161,7 @@ executable hledger
|
||||
, regex-tdfa
|
||||
, safe >= 0.2
|
||||
, split >= 0.1 && < 0.3
|
||||
, temporary
|
||||
, text >= 0.11
|
||||
, tabular >= 0.2 && < 0.3
|
||||
, utf8-string >= 0.3.5 && < 1.1
|
||||
@ -213,6 +217,7 @@ test-suite test
|
||||
, regex-tdfa
|
||||
, safe >= 0.2
|
||||
, split >= 0.1 && < 0.3
|
||||
, temporary
|
||||
, text >= 0.11
|
||||
, tabular >= 0.2 && < 0.3
|
||||
, utf8-string >= 0.3.5 && < 1.1
|
||||
@ -256,6 +261,7 @@ benchmark bench
|
||||
criterion,
|
||||
html,
|
||||
tabular >= 0.2 && < 0.3,
|
||||
temporary,
|
||||
timeit,
|
||||
process,
|
||||
file-embed,
|
||||
|
Loading…
Reference in New Issue
Block a user