Commit c4fe25b60c80f10acae5cfb73141b0e315a0a1fc

Authored by Henry Fredrick Schreiner
1 parent 9f81385b

Adding some details to changelog

Showing 2 changed files with 56 additions and 53 deletions
CHANGELOG.md
1   -## Version 1.8: Sets and Flags
  1 +## Version 1.8: Sets and Flags (IN PROGRESS)
2 2  
3   -Set handling has been completely replaced by a new backend that works as a Validator. This provides a single interface instead of the 16 different functions in App. It also allows ordered collections to be used, custom functions for filtering, and better help and error messages. You can also use a collection of pairs (like `std::map`) to transform the match into an output. Also new are inverted flags, which can cancel or reduce the count of flags, and can also support basic number assignment. A new `add_option_fn` lets you more easily program CLI11 options with the types you choose. Vector options now support a custom separator. Apps can now be composed with unnamed subcommand support.
  3 +Set handling has been completely replaced by a new backend that works as a Validator. This provides a single interface instead of the 16 different functions in App. It also allows ordered collections to be used, custom functions for filtering, and better help and error messages. You can also use a collection of pairs (like `std::map`) to transform the match into an output. Also new are inverted flags, which can cancel or reduce the count of flags, and can also support general flag types. A new `add_option_fn` lets you more easily program CLI11 options with the types you choose. Vector options now support a custom separator. Apps can now be composed with unnamed subcommand support.
4 4  
5 5 * New `CLI::IsMember` validator replaces set validation [#222]
6 6 * IsMember also supports container of pairs, transform allows modification of result [#228]
7   -* Much more powerful flags with different values [#211]
  7 +* Much more powerful flags with different values [#211], general types [#235]
8 8 * `add_option` now supports bool due to unified bool handling [#211]
9 9 * Support for composable unnamed subcommands [#216]
10   -* Custom vector separator [#209], [#221]
  10 +* Custom vector separator using `->delimiter(char)` [#209], [#221], [#240]
11 11 * Validators added for IP4 addresses and positive numbers [#210]
12 12 * Minimum required Boost for optional Optionals has been corrected to 1.61 [#226]
13 13 * Positionals can stop options from being parsed with `app.positionals_at_end()` [#223]
... ... @@ -37,6 +37,8 @@ Set handling has been completely replaced by a new backend that works as a Valid
37 37 [#230]: https://github.com/CLIUtils/CLI11/pull/230
38 38 [#232]: https://github.com/CLIUtils/CLI11/pull/232
39 39 [#233]: https://github.com/CLIUtils/CLI11/pull/233
  40 +[#235]: https://github.com/CLIUtils/CLI11/pull/235
  41 +[#240]: https://github.com/CLIUtils/CLI11/pull/240
40 42  
41 43  
42 44 ## Version 1.7.1: Quick patch
... ...
README.md
... ... @@ -113,7 +113,6 @@ There are some other possible "features" that are intentionally not supported by
113 113  
114 114 - Non-standard variations on syntax, like `-long` options. This is non-standard and should be avoided, so that is enforced by this library.
115 115 - Completion of partial options, such as Python's `argparse` supplies for incomplete arguments. It's better not to guess. Most third party command line parsers for python actually reimplement command line parsing rather than using argparse because of this perceived design flaw.
116   -- In C++14, you could have a set of `callback` methods with differing signatures (tested in a branch). Not deemed worth having a C++14 variation on API and removed.
117 116 - Autocomplete: This might eventually be added to both Plumbum and CLI11, but it is not supported yet.
118 117 - Wide strings / unicode: Since this uses the standard library only, it might be hard to properly implement, but I would be open to suggestions in how to do this.
119 118  
... ... @@ -177,62 +176,62 @@ The initialization is just one line, adding options is just two each. The parse
177 176 While all options internally are the same type, there are several ways to add an option depending on what you need. The supported values are:
178 177  
179 178 ```cpp
180   -app.add_option(option_name, help_str="")
  179 +// Add options
  180 +app.add_option(option_name, help_str="") // ๐Ÿšง
181 181  
182 182 app.add_option(option_name,
183   - variable_to_bind_to, // bool, int, float, vector, enum, or string-like, or anything with a defined conversion from a string
  183 + variable_to_bind_to, // bool, int, float, vector, ๐Ÿšง enum, or string-like, or anything with a defined conversion from a string
184 184 help_string="",
185 185 default=false)
186 186  
187 187 app.add_option_function<type>(option_name,
188   - function <void(const type &value)>, // int, bool, float, enum, vector, or string-like, or anything with a defined conversion from a string
  188 + function <void(const type &value)>, // ๐Ÿšง int, bool, float, enum, vector, or string-like, or anything with a defined conversion from a string
189 189 help_string="")
190 190  
191 191 app.add_complex(... // Special case: support for complex numbers
192 192  
  193 +// Add flags
193 194 app.add_flag(option_name,
194 195 help_string="")
195 196  
196 197 app.add_flag(option_name,
197   - variable_to_bind_to, // bool, int, float, vector, enum, or string-like, or anything with a defined conversion from a string
  198 + variable_to_bind_to, // bool, int, ๐Ÿšง float, ๐Ÿšง vector, ๐Ÿšง enum, or ๐Ÿšง string-like, or ๐Ÿšง anything with a defined conversion from a string
198 199 help_string="")
199 200  
200   -app.add_flag_function(option_name,
  201 +app.add_flag_function(option_name, // ๐Ÿšง
201 202 function <void(int64_t count)>,
202 203 help_string="")
203 204  
204   -app.add_flag_callback(option_name,function<void(void)>,help_string="")
  205 +app.add_flag_callback(option_name,function<void(void)>,help_string="") // ๐Ÿšง
205 206  
  207 +// Add subcommands
206 208 App* subcom = app.add_subcommand(name, description);
  209 +
  210 +// ๐Ÿšง All add_*set* methods deprecated in CLI11 1.8 - use ->transform(CLI::IsMember) instead
  211 +-app.add_set(option_name,
  212 +- variable_to_bind_to, // Same type as stored by set
  213 +- set_of_possible_options, // Set will be copied, ignores changes
  214 +- help_string="",
  215 +- default=false)
  216 +-app.add_mutable_set(... // Set can change later, keeps reference
  217 +-app.add_set_ignore_case(... // String only
  218 +-app.add_mutable_set_ignore_case(... // String only
  219 +-app.add_set_ignore_underscore(... // String only
  220 +-app.add_mutable_set_ignore_underscore(... // String only
  221 +-app.add_set_ignore_case_underscore(... // String only
  222 +-app.add_mutable_set_ignore_case_underscore(... // String only
207 223 ```
208 224  
209 225 An option name must start with a alphabetic character, underscore, or a number. For long options, anything but an equals sign or a comma is valid after that, though for the `add_flag*` functions '{' has special meaning. Names are given as a comma separated string, with the dash or dashes. An option or flag can have as many names as you want, and afterward, using `count`, you can use any of the names, with dashes as needed, to count the options. One of the names is allowed to be given without proceeding dash(es); if present the option is a positional option, and that name will be used on help line for its positional form. If you want the default value to print in the help description, pass in `true` for the final parameter for `add_option`.
210 226  
211 227 The `add_option_function<type>(...` function will typically require the template parameter be given unless a `std::function` object with an exact match is passed. The type can be any type supported by the `add_option` function.
212 228  
213   -Flag options specified through the functions
  229 +๐Ÿšง Flag options specified through the `add_flag*` functions allow a syntax for the option names to default particular options to a false value or any other value if some flags are passed. For example:
214 230  
215 231 ```cpp
216   -app.add_flag(option_name,
217   - help_string="")
218   -
219   -app.add_flag(option_name,
220   - variable_to_bind_to,
221   - help_string="")
222   -
223   -app.add_flag_function(option_name,
224   - function <void(int64_t count)>,
225   - help_string="")
226   -
227   -app.add_flag_callback(option_name,function<void(void)>,help_string="")
  232 +app.add_flag("--flag,!--no-flag,result,"help for flag"); // ๐Ÿšง
228 233 ```
229 234  
230   -which allow a syntax for the option names to default particular options to a false value or any other value if some flags are passed. For example:
231   -
232   -```cpp
233   -app.add_flag("--flag,!--no-flag,result,"help for flag");`
234   -``````
235   -
236 235 specifies that if `--flag` is passed on the command line result will be true or contain a value of 1. If `--no-flag` is
237 236 passed `result` will contain false or -1 if `result` is a signed integer type, or 0 if it is an unsigned type. An
238 237 alternative form of the syntax is more explicit: `"--flag,--no-flag{false}"`; this is equivalent to the previous
... ... @@ -241,9 +240,9 @@ default behavior is to take the last value given, while if `variable_to_bind_to`
241 240 all the given arguments and return the result. This can be modified if needed by changing the `multi_option_policy` on each flag (this is not inherited).
242 241 The default value can be any value For example if you wished to define a numerical flag
243 242 ```cpp
244   -app.add_flag("-1{1},-2{2},-3{3}",result,"numerical flag")
  243 +app.add_flag("-1{1},-2{2},-3{3}",result,"numerical flag") // ๐Ÿšง
245 244 ```
246   -using any of those flags on the command line will result in the specified number in the output. Similar things can be done for string values, and enumerations, as long as the default value can be converted to the given type.
  245 +using any of those flags on the command line will result in the specified number in the output. Similar things can be done for string values, and enumerations, as long as the default value can be converted to the given type.
247 246  
248 247  
249 248 On a C++14 compiler, you can pass a callback function directly to `.add_flag`, while in C++11 mode you'll need to use `.add_flag_function` if you want a callback function. The function will be given the number of times the flag was passed. You can throw a relevant `CLI::ParseError` to signal a failure.
... ... @@ -271,26 +270,28 @@ Before parsing, you can set the following options:
271 270 - `->envname(name)`: Gets the value from the environment if present and not passed on the command line.
272 271 - `->group(name)`: The help group to put the option in. No effect for positional options. Defaults to `"Options"`. `""` will not show up in the help print (hidden).
273 272 - `->ignore_case()`: Ignore the case on the command line (also works on subcommands, does not affect arguments).
274   -- `->ignore_underscore()`: Ignore any underscores in the options names (also works on subcommands, does not affect arguments). For example "option_one" will match with "optionone". This does not apply to short form options since they only have one character
275   -- `->disable_flag_override()`: from the command line long form flag option can be assigned a value on the command line using the `=` notation `--flag=value`. If this behavior is not desired, the `disable_flag_override()` disables it and will generate an exception if it is done on the command line. The `=` does not work with short form flag options.
276   -- `->delimiter(char)`: allows specification of a custom delimiter for separating single arguments into vector arguments, for example specifying `->delimiter(',')` on an option would result in `--opt=1,2,3` producing 3 elements of a vector and the equivalent of --opt 1 2 3 assuming opt is a vector value
  273 +- `->ignore_underscore()`: ๐Ÿšง Ignore any underscores in the options names (also works on subcommands, does not affect arguments). For example "option_one" will match with "optionone". This does not apply to short form options since they only have one character
  274 +- `->disable_flag_override()`: ๐Ÿšง from the command line long form flag option can be assigned a value on the command line using the `=` notation `--flag=value`. If this behavior is not desired, the `disable_flag_override()` disables it and will generate an exception if it is done on the command line. The `=` does not work with short form flag options.
  275 +- `->delimiter(char)`: ๐Ÿšง allows specification of a custom delimiter for separating single arguments into vector arguments, for example specifying `->delimiter(',')` on an option would result in `--opt=1,2,3` producing 3 elements of a vector and the equivalent of --opt 1 2 3 assuming opt is a vector value
277 276 - `->description(str)`: Set/change the description.
278 277 - `->multi_option_policy(CLI::MultiOptionPolicy::Throw)`: Set the multi-option policy. Shortcuts available: `->take_last()`, `->take_first()`, and `->join()`. This will only affect options expecting 1 argument or bool flags (which do not inherit their default but always start with a specific policy).
279   -- `->check(CLI::IsMember(...))`: Require an option be a member of a given set. See below for options.
280   -- `->transform(CLI::IsMember(...))`: Require an option be a member of a given set or map. Can change the parse. See below for options.
  278 +- `->check(CLI::IsMember(...))`: ๐Ÿšง Require an option be a member of a given set. See below for options.
  279 +- `->transform(CLI::IsMember(...))`: ๐Ÿšง Require an option be a member of a given set or map. Can change the parse. See below for options.
281 280 - `->check(CLI::ExistingFile)`: Requires that the file exists if given.
282 281 - `->check(CLI::ExistingDirectory)`: Requires that the directory exists.
283 282 - `->check(CLI::ExistingPath)`: Requires that the path (file or directory) exists.
284 283 - `->check(CLI::NonexistentPath)`: Requires that the path does not exist.
285 284 - `->check(CLI::Range(min,max))`: Requires that the option be between min and max (make sure to use floating point if needed). Min defaults to 0.
286   -- `->check(CLI::PositiveNumber)`: Requires the number be greater or equal to 0
287   -- `->check(CLI::ValidIPV4)`: Requires that the option be a valid IPv4 string e.g. `'255.255.255.255'`, `'10.1.1.7'`
  285 +- `->check(CLI::PositiveNumber)`: ๐Ÿšง Requires the number be greater or equal to 0
  286 +- `->check(CLI::ValidIPV4)`: ๐Ÿšง Requires that the option be a valid IPv4 string e.g. `'255.255.255.255'`, `'10.1.1.7'`
288 287 - `->transform(std::string(std::string))`: Converts the input string into the output string, in-place in the parsed options.
289 288 - `->each(void(std::string)>`: Run this function on each value received, as it is received.
290 289 - `->configurable(false)`: Disable this option from being in a configuration file.
291 290  
292 291  
293   -These options return the `Option` pointer, so you can chain them together, and even skip storing the pointer entirely. Check takes any function that has the signature `void(const std::string&)`; it should throw a `ValidationError` when validation fails. The help message will have the name of the parent option prepended. Since `check` and `transform` use the same underlying mechanism, you can chain as many as you want, and they will be executed in order. If you just want to see the unconverted values, use `.results()` to get the `std::vector<std::string>` of results. Validate can also be a subclass of `CLI::Validator`, in which case it can also set the type name and can be combined with `&` and `|` (all built-in validators are this sort). Validators can also be inverted with `!` such as `->check(!CLI::ExistingFile)` which would check that a file doesn't exist.
  292 +These options return the `Option` pointer, so you can chain them together, and even skip storing the pointer entirely. Check takes any function that has the signature `void(const std::string&)`; it should throw a `ValidationError` when validation fails. The help message will have the name of the parent option prepended. Since `check` and `transform` use the same underlying mechanism, you can chain as many as you want, and they will be executed in order. If you just want to see the unconverted values, use `.results()` to get the `std::vector<std::string>` of results. Validate can also be a subclass of `CLI::Validator`, in which case it can also set the type name and can be combined with `&` and `|` (all built-in validators are this sort). Validators can also be inverted with `!` such as `->check(!CLI::ExistingFile)` which would check that a file doesn't exist.
  293 +
  294 +> ๐Ÿšง IsMember is new in CLI11 1.8
294 295  
295 296 The `IsMember` validator lets you specify a set of predefined options. You can pass any container or copyable pointer (including `std::shared_ptr`) to a container to this validator; the container just needs to be iterable and have a `::value_type`. The type should be convertible from a string. You can use an initializer list directly if you like. If you need to modify the set later, the pointer form lets you do that; the type message and check will correctly refer to the current version of the set.
296 297 After specifying a set of options, you can also specify "filter" functions of the form `T(T)`, where `T` is the type of the values. The most common choices probably will be `CLI::ignore_case` an `CLI::ignore_underscore`.
... ... @@ -312,7 +313,7 @@ On the command line, options can be given as:
312 313 - `-ffilename` (no space required)
313 314 - `-abcf filename` (flags and option can be combined)
314 315 - `--long` (long flag)
315   -- `--long_flag=true` (long flag with equals to override default value)
  316 +- `--long_flag=true` (long flag with equals to override default value) ๐Ÿšง
316 317 - `--file filename` (space)
317 318 - `--file=filename` (equals)
318 319  
... ... @@ -322,10 +323,10 @@ If `allow_windows_style_options()` is specified in the application or subcommand
322 323 - `/long` (long flag)
323 324 - `/file filename` (space)
324 325 - `/file:filename` (colon)
325   -- `/long_flag:false (long flag with : to override the default value)
  326 +- `/long_flag:false (long flag with : to override the default value) ๐Ÿšง
326 327 = Windows style options do not allow combining short options or values not separated from the short option like with `-` options
327 328  
328   -Long flag options may be given with an `=<value>` to allow specifying a false value, or some other value to the flag. See [config files](#configuration-file) for details on the values supported. NOTE: only the `=` or `:` for windows-style options may be used for this, using a space will result in the argument being interpreted as a positional argument. This syntax can override the default values, and can be disabled by using `disable_flag_override()`.
  329 +๐Ÿšง Long flag options may be given with an `=<value>` to allow specifying a false value, or some other value to the flag. See [config files](#configuration-file) for details on the values supported. NOTE: only the `=` or `:` for windows-style options may be used for this, using a space will result in the argument being interpreted as a positional argument. This syntax can override the default values, and can be disabled by using `disable_flag_override()`.
329 330  
330 331 Extra positional arguments will cause the program to exit, so at least one positional option with a vector is recommended if you want to allow extraneous arguments.
331 332 If you set `.allow_extras()` on the main `App`, you will not get an error. You can access the missing options using `remaining` (if you have subcommands, `app.remaining(true)` will get all remaining options, subcommands included).
... ... @@ -334,12 +335,12 @@ You can access a vector of pointers to the parsed options in the original order
334 335 If `--` is present in the command line that does not end an unlimited option, then
335 336 everything after that is positional only.
336 337  
337   -#### Getting results
  338 +#### Getting results ๐Ÿšง
338 339 In most cases the fastest and easiest way is to return the results through a callback or variable specified in one of the `add_*` functions. But there are situations where this is not possible or desired. For these cases the results may be obtained through one of the following functions. Please note that these functions will do any type conversions and processing during the call so should not used in performance critical code:
339 340  
340 341 - `results()`: retrieves a vector of strings with all the results in the order they were given.
341   -- `results(variable_to_bind_to)`: gets the results according to the MultiOptionPolicy and converts them just like the `add_option_function` with a variable.
342   -- `Value=as<type>()`: returns the result or default value directly as the specified type if possible, can be vector to return all results, and a non-vector to get the result according to the MultiOptionPolicy in place.
  342 +- `results(variable_to_bind_to)`: ๐Ÿšง gets the results according to the MultiOptionPolicy and converts them just like the `add_option_function` with a variable.
  343 +- `Value=as<type>()`: ๐Ÿšง returns the result or default value directly as the specified type if possible, can be vector to return all results, and a non-vector to get the result according to the MultiOptionPolicy in place.
343 344  
344 345 ### Subcommands
345 346  
... ... @@ -357,7 +358,7 @@ even exit the program through the callback. The main `App` has a callback slot,
357 358 You are allowed to throw `CLI::Success` in the callbacks.
358 359 Multiple subcommands are allowed, to allow [`Click`][click] like series of commands (order is preserved).
359 360  
360   -Subcommands may also have an empty name either by calling `add_subcommand` with an empty string for the name or with no arguments.
  361 +๐Ÿšง Subcommands may also have an empty name either by calling `add_subcommand` with an empty string for the name or with no arguments.
361 362 Nameless subcommands function a similarly to groups in the main `App`. If an option is not defined in the main App, all nameless subcommands are checked as well. This allows for the options to be defined in a composable group. The `add_subcommand` function has an overload for adding a `shared_ptr<App>` so the subcommand(s) could be defined in different components and merged into a main `App`, or possibly multiple `Apps`. Multiple nameless subcommands are allowed.
362 363  
363 364 #### Subcommand options
... ... @@ -372,12 +373,12 @@ There are several options that are supported on the main app and subcommands. Th
372 373 - `.require_subcommand(N)`: Require `N` subcommands if `N>0`, or up to `N` if `N<0`. `N=0` resets to the default 0 or more.
373 374 - `.require_subcommand(min, max)`: Explicitly set min and max allowed subcommands. Setting `max` to 0 is unlimited.
374 375 - `.add_subcommand(name="", description="")` Add a subcommand, returns a pointer to the internally stored subcommand.
375   -- `.add_subcommand(shared_ptr<App>)` Add a subcommand by shared_ptr, returns a pointer to the internally stored subcommand.
  376 +- `.add_subcommand(shared_ptr<App>)` ๐Ÿšง Add a subcommand by shared_ptr, returns a pointer to the internally stored subcommand.
376 377 - `.got_subcommand(App_or_name)`: Check to see if a subcommand was received on the command line.
377 378 - `.get_subcommands(filter)`: The list of subcommands given on the command line.
378 379 - `.get_parent()`: Get the parent App or nullptr if called on master App.
379 380 - `.get_option(name)`: Get an option pointer by option name will throw if the specified option is not available, nameless subcommands are also searched
380   -- `.get_option_no_throw(name)`: Get an option pointer by option name. This function will return a `nullptr` instead of throwing if the option is not available.
  381 +- `.get_option_no_throw(name)`: ๐Ÿšง Get an option pointer by option name. This function will return a `nullptr` instead of throwing if the option is not available.
381 382 - `.get_options(filter)`: Get the list of all defined option pointers (useful for processing the app for custom output formats).
382 383 - `.parse_order()`: Get the list of option pointers in the order they were parsed (including duplicates).
383 384 - `.formatter(fmt)`: Set a formatter, with signature `std::string(const App*, std::string, AppFormatMode)`. See Formatting for more details.
... ... @@ -387,14 +388,14 @@ There are several options that are supported on the main app and subcommands. Th
387 388 - `.name(name)`: Add or change the name.
388 389 - `.callback(void() function)`: Set the callback that runs at the end of parsing. The options have already run at this point.
389 390 - `.allow_extras()`: Do not throw an error if extra arguments are left over.
390   -- `.positionals_at_end()`: Specify that positional arguments occur as the last arguments and throw an error if an unexpected positional is encountered.
  391 +- `.positionals_at_end()`: ๐Ÿšง Specify that positional arguments occur as the last arguments and throw an error if an unexpected positional is encountered.
391 392 - `.prefix_command()`: Like `allow_extras`, but stop immediately on the first unrecognized item. It is ideal for allowing your app or subcommand to be a "prefix" to calling another app.
392 393 - `.footer(message)`: Set text to appear at the bottom of the help string.
393 394 - `.set_help_flag(name, message)`: Set the help flag name and message, returns a pointer to the created option.
394 395 - `.set_help_all_flag(name, message)`: Set the help all flag name and message, returns a pointer to the created option. Expands subcommands.
395 396 - `.failure_message(func)`: Set the failure message function. Two provided: `CLI::FailureMessage::help` and `CLI::FailureMessage::simple` (the default).
396 397 - `.group(name)`: Set a group name, defaults to `"Subcommands"`. Setting `""` will be hide the subcommand.
397   -- `[option_name]`: retrieve a const pointer to an option given by `option_name` for Example `app["--flag1"]` will get a pointer to the option for the "--flag1" value, `app["--flag1"]->as<bool>() will get the results of the command line for a flag
  398 +- `[option_name]`: ๐Ÿšง retrieve a const pointer to an option given by `option_name` for Example `app["--flag1"]` will get a pointer to the option for the "--flag1" value, `app["--flag1"]->as<bool>() will get the results of the command line for a flag
398 399  
399 400 > Note: if you have a fixed number of required positional options, that will match before subcommand names. `{}` is an empty filter function.
400 401  
... ... @@ -424,7 +425,7 @@ in_subcommand = Wow
424 425 sub.subcommand = true
425 426 ```
426 427  
427   -Spaces before and after the name and argument are ignored. Multiple arguments are separated by spaces. One set of quotes will be removed, preserving spaces (the same way the command line works). Boolean options can be `true`, `on`, `1`, `yes`,`enable`; or `false`, `off`, `0`, `no`,`disable` (case insensitive). Sections (and `.` separated names) are treated as subcommands (note: this does not mean that subcommand was passed, it just sets the "defaults". You cannot set positional-only arguments or force subcommands to be present in the command line.
  428 +Spaces before and after the name and argument are ignored. Multiple arguments are separated by spaces. One set of quotes will be removed, preserving spaces (the same way the command line works). Boolean options can be `true`, `on`, `1`, `yes`,`enable ๐Ÿšง`; or `false`, `off`, `0`, `no`,`disable ๐Ÿšง` (case insensitive). Sections (and `.` separated names) are treated as subcommands (note: this does not mean that subcommand was passed, it just sets the "defaults". You cannot set positional-only arguments or force subcommands to be present in the command line.
428 429  
429 430 To print a configuration file from the passed
430 431 arguments, use `.config_to_str(default_also=false, prefix="", write_description=false)`, where `default_also` will also show any defaulted arguments, `prefix` will add a prefix, and `write_description` will include option descriptions.
... ... @@ -433,7 +434,7 @@ arguments, use `.config_to_str(default_also=false, prefix=&quot;&quot;, write_description=
433 434  
434 435 Many of the defaults for subcommands and even options are inherited from their creators. The inherited default values for subcommands are `allow_extras`, `prefix_command`, `ignore_case`, `ignore_underscore`, `fallthrough`, `group`, `footer`, and maximum number of required subcommands. The help flag existence, name, and description are inherited, as well.
435 436  
436   -Options have defaults for `group`, `required`, `disable_flag_override`,`multi_option_policy`, `ignore_underscore`,`delimiter`, and `ignore_case`. To set these defaults, you should set the `option_defaults()` object, for example:
  437 +Options have defaults for `group`, `required`, `multi_option_policy`, `ignore_case`, `ignore_underscore`, `delimiter ๐Ÿšง`, and `disable_flag_override ๐Ÿšง`. To set these defaults, you should set the `option_defaults()` object, for example:
437 438  
438 439 ```cpp
439 440 app.option_defaults()->required();
... ...