如何在 optparse-applicative 生成的帮助消息中指定缺失命令的名称?
How do I specify names for missing commands in the help message generated by optparse-applicative?
我正在尝试使用 Hackage 的 optparse-applicative 包,但有一个问题是当程序 运行 没有指定足够的命令时如何指定显示的帮助消息的某个方面。
下面的示例程序说明了我的问题。当来自命令行的 运行 时,它将两个命令之一作为输入。也就是说,它的目的是 运行 作为 $ program com1
或 $ program com2
。
module Main where
import Options.Applicative
import Data.Semigroup ((<>))
data Command = Com1
| Com2
com1 :: Parser Command
com1 = subparser $ command "com1" $ info (pure Com1) fullDesc
com2 :: Parser Command
com2 = subparser $ command "com2" $ info (pure Com2) fullDesc
commandParser :: Parser Command
commandParser = com1
<|> com2
runCommand :: Command -> IO ()
runCommand Com1 = putStrLn ">>> Com1 <<<"
runCommand Com2 = putStrLn ">>> Com2 <<<"
opts :: ParserInfo Command
opts = info (commandParser <**> helper)
$ fullDesc
<> progDesc "=== progDesc ==="
<> header "=== header ==="
<> footer "=== footer ==="
main :: IO ()
main = runCommand =<< execParser opts
当此程序 运行 既未指定命令 com1
也未指定 com2
时,将显示一条帮助消息。
$ program
Missing: (COMMAND | COMMAND)
Usage: options-applicative-example-exe (COMMAND | COMMAND)
=== progDesc ===
此帮助消息显示 (COMMAND | COMMAND)
而不是 (com1 | com2)
,我认为在此帮助消息中指定名称会更清晰、更有用。
如 $ program --help
中那样指定 --help
选项会给出不同的输出。
$ program --help
=== header ===
Usage: options-applicative-example-exe (COMMAND | COMMAND)
=== progDesc ===
Available options:
-h,--help Show this help text
Available commands:
com1
com2
=== footer ===
命令名称 com1
和 com2
列在 "Available commands" 部分。然而,在这里,我认为用法部分会更清晰,因为 (com1 | com2)
而不是 (COMMAND | COMMAND)
。
如何将帮助消息的用法部分指定为 (com1 | com2)
而不是 (COMMAND | COMMAND)
?
看来你可以在命令上使用 metavar
。
com1 = subparser $ mconcat
[ metavar c
, command c $ info (pure Com1) fullDesc)
] where c = "com1"
而这里每个命令都是它自己的子解析器,optparse-applicative
的文档更喜欢在将 subparser
应用于整体之前先组合 command
修饰符,所以我们只会看到一个COMMAND
和 metavar
效果不佳。
我正在尝试使用 Hackage 的 optparse-applicative 包,但有一个问题是当程序 运行 没有指定足够的命令时如何指定显示的帮助消息的某个方面。
下面的示例程序说明了我的问题。当来自命令行的 运行 时,它将两个命令之一作为输入。也就是说,它的目的是 运行 作为 $ program com1
或 $ program com2
。
module Main where
import Options.Applicative
import Data.Semigroup ((<>))
data Command = Com1
| Com2
com1 :: Parser Command
com1 = subparser $ command "com1" $ info (pure Com1) fullDesc
com2 :: Parser Command
com2 = subparser $ command "com2" $ info (pure Com2) fullDesc
commandParser :: Parser Command
commandParser = com1
<|> com2
runCommand :: Command -> IO ()
runCommand Com1 = putStrLn ">>> Com1 <<<"
runCommand Com2 = putStrLn ">>> Com2 <<<"
opts :: ParserInfo Command
opts = info (commandParser <**> helper)
$ fullDesc
<> progDesc "=== progDesc ==="
<> header "=== header ==="
<> footer "=== footer ==="
main :: IO ()
main = runCommand =<< execParser opts
当此程序 运行 既未指定命令 com1
也未指定 com2
时,将显示一条帮助消息。
$ program
Missing: (COMMAND | COMMAND)
Usage: options-applicative-example-exe (COMMAND | COMMAND)
=== progDesc ===
此帮助消息显示 (COMMAND | COMMAND)
而不是 (com1 | com2)
,我认为在此帮助消息中指定名称会更清晰、更有用。
如 $ program --help
中那样指定 --help
选项会给出不同的输出。
$ program --help
=== header ===
Usage: options-applicative-example-exe (COMMAND | COMMAND)
=== progDesc ===
Available options:
-h,--help Show this help text
Available commands:
com1
com2
=== footer ===
命令名称 com1
和 com2
列在 "Available commands" 部分。然而,在这里,我认为用法部分会更清晰,因为 (com1 | com2)
而不是 (COMMAND | COMMAND)
。
如何将帮助消息的用法部分指定为 (com1 | com2)
而不是 (COMMAND | COMMAND)
?
看来你可以在命令上使用 metavar
。
com1 = subparser $ mconcat
[ metavar c
, command c $ info (pure Com1) fullDesc)
] where c = "com1"
而这里每个命令都是它自己的子解析器,optparse-applicative
的文档更喜欢在将 subparser
应用于整体之前先组合 command
修饰符,所以我们只会看到一个COMMAND
和 metavar
效果不佳。