如何在optparse-applicative生成的帮助消息中指定缺失命令的名称?

mhe*_*rzl 7 haskell 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
Run Code Online (Sandbox Code Playgroud)

如果既未使用命令com1也未com2指定此程序,则会显示帮助消息.

$ program
Missing: (COMMAND | COMMAND)

Usage: options-applicative-example-exe (COMMAND | COMMAND)
  === progDesc ===
Run Code Online (Sandbox Code Playgroud)

显示此帮助消息(COMMAND | COMMAND)而不是(com1 | com2),我认为在此帮助消息中指定名称将更清晰,更有用.

--help选项指定为$ program --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 ===
Run Code Online (Sandbox Code Playgroud)

命令名称com1com2列"可用命令"部分.然而,在这里,我认为使用部分将更清晰,(com1 | com2)而不是(COMMAND | COMMAND).

如何指定帮助消息的使用部分(com1 | com2)而不是(COMMAND | COMMAND)

Li-*_*Xia 7

看来你可以metavar在命令上使用它.

com1 = subparser $ mconcat
  [ metavar c
  , command c $ info (pure Com1) fullDesc)
  ] where c = "com1"
Run Code Online (Sandbox Code Playgroud)

虽然这里的每个命令都是它自己的subparser,但是在应用于整体之前首先optparse-applicative要结合command修饰符的文档subparser,所以我们只会看到一个COMMAND并且metavar不能正常工作.

  • 在这个PR中为`hs-init`应用你的建议:https://github.com/vrom911/hs-init/pull/43 (2认同)