fix(complete): Handle newlines in command/arg descriptions

Found while trying to add Nushell completions to
[`jj`](https://github.com/martinvonz/jj).
This commit is contained in:
Alexis (Poliorcetics) Bourget 2024-02-16 21:57:54 +01:00 committed by Ed Page
parent fba7c8597b
commit e782775229
20 changed files with 64 additions and 91 deletions

View file

@ -57,9 +57,9 @@ fn escape_string(string: &str) -> String {
string.replace('\'', "''")
}
fn get_tooltip<T: ToString>(help: Option<&StyledStr>, data: T) -> String {
fn escape_help<T: ToString>(help: Option<&StyledStr>, data: T) -> String {
match help {
Some(help) => escape_string(&help.to_string()),
Some(help) => escape_string(&help.to_string().replace('\n', " ")),
_ => data.to_string(),
}
}
@ -78,7 +78,7 @@ fn generate_inner(p: &Command, previous_command_name: &str) -> String {
for option in p.get_opts() {
if let Some(shorts) = option.get_short_and_visible_aliases() {
let tooltip = get_tooltip(option.get_help(), shorts[0]);
let tooltip = escape_help(option.get_help(), shorts[0]);
for short in shorts {
completions.push_str(&preamble);
completions.push_str(format!("-{short} '{tooltip}'").as_str());
@ -86,7 +86,7 @@ fn generate_inner(p: &Command, previous_command_name: &str) -> String {
}
if let Some(longs) = option.get_long_and_visible_aliases() {
let tooltip = get_tooltip(option.get_help(), longs[0]);
let tooltip = escape_help(option.get_help(), longs[0]);
for long in longs {
completions.push_str(&preamble);
completions.push_str(format!("--{long} '{tooltip}'").as_str());
@ -96,7 +96,7 @@ fn generate_inner(p: &Command, previous_command_name: &str) -> String {
for flag in utils::flags(p) {
if let Some(shorts) = flag.get_short_and_visible_aliases() {
let tooltip = get_tooltip(flag.get_help(), shorts[0]);
let tooltip = escape_help(flag.get_help(), shorts[0]);
for short in shorts {
completions.push_str(&preamble);
completions.push_str(format!("-{short} '{tooltip}'").as_str());
@ -104,7 +104,7 @@ fn generate_inner(p: &Command, previous_command_name: &str) -> String {
}
if let Some(longs) = flag.get_long_and_visible_aliases() {
let tooltip = get_tooltip(flag.get_help(), longs[0]);
let tooltip = escape_help(flag.get_help(), longs[0]);
for long in longs {
completions.push_str(&preamble);
completions.push_str(format!("--{long} '{tooltip}'").as_str());
@ -114,7 +114,7 @@ fn generate_inner(p: &Command, previous_command_name: &str) -> String {
for subcommand in p.get_subcommands() {
let data = &subcommand.get_name();
let tooltip = get_tooltip(subcommand.get_about(), data);
let tooltip = escape_help(subcommand.get_about(), data);
completions.push_str(&preamble);
completions.push_str(format!("{data} '{tooltip}'").as_str());

View file

@ -36,6 +36,10 @@ fn escape_string(string: &str, escape_comma: bool) -> String {
}
}
fn escape_help(help: &clap::builder::StyledStr) -> String {
escape_string(&help.to_string().replace('\n', " "), false)
}
fn gen_fish_inner(
root_command: &str,
parent_commands: &[&str],
@ -98,8 +102,7 @@ fn gen_fish_inner(
}
if let Some(data) = option.get_help() {
template
.push_str(format!(" -d '{}'", escape_string(&data.to_string(), false)).as_str());
template.push_str(&format!(" -d '{}'", escape_help(data)));
}
template.push_str(value_completion(option).as_str());
@ -124,8 +127,7 @@ fn gen_fish_inner(
}
if let Some(data) = flag.get_help() {
template
.push_str(format!(" -d '{}'", escape_string(&data.to_string(), false)).as_str());
template.push_str(&format!(" -d '{}'", escape_help(data)));
}
buffer.push_str(template.as_str());
@ -139,7 +141,7 @@ fn gen_fish_inner(
template.push_str(format!(" -a \"{}\"", &subcommand.get_name()).as_str());
if let Some(data) = subcommand.get_about() {
template.push_str(format!(" -d '{}'", escape_string(&data.to_string(), false)).as_str())
template.push_str(format!(" -d '{}'", escape_help(data)).as_str())
}
buffer.push_str(template.as_str());
@ -173,7 +175,7 @@ fn value_completion(option: &Arg) -> String {
Some(format!(
"{}\t'{}'",
escape_string(value.get_name(), true).as_str(),
escape_string(&value.get_help().unwrap_or_default().to_string(), false)
escape_help(value.get_help().unwrap_or_default())
))
})
.collect::<Vec<_>>()

View file

@ -62,9 +62,9 @@ fn escape_string(string: &str) -> String {
string.replace('\'', "''")
}
fn get_tooltip<T: ToString>(help: Option<&StyledStr>, data: T) -> String {
fn escape_help<T: ToString>(help: Option<&StyledStr>, data: T) -> String {
match help {
Some(help) => escape_string(&help.to_string()),
Some(help) => escape_string(&help.to_string().replace('\n', " ")),
_ => data.to_string(),
}
}
@ -91,7 +91,7 @@ fn generate_inner(p: &Command, previous_command_name: &str) -> String {
for subcommand in p.get_subcommands() {
let data = &subcommand.get_name();
let tooltip = get_tooltip(subcommand.get_about(), data);
let tooltip = escape_help(subcommand.get_about(), data);
completions.push_str(&preamble);
completions.push_str(
@ -120,7 +120,7 @@ fn generate_aliases(completions: &mut String, preamble: &String, arg: &Arg) {
use std::fmt::Write as _;
if let Some(aliases) = arg.get_short_and_visible_aliases() {
let tooltip = get_tooltip(arg.get_help(), aliases[0]);
let tooltip = escape_help(arg.get_help(), aliases[0]);
for alias in aliases {
let _ = write!(
completions,
@ -131,7 +131,7 @@ fn generate_aliases(completions: &mut String, preamble: &String, arg: &Arg) {
}
}
if let Some(aliases) = arg.get_long_and_visible_aliases() {
let tooltip = get_tooltip(arg.get_help(), aliases[0]);
let tooltip = escape_help(arg.get_help(), aliases[0]);
for alias in aliases {
let _ = write!(
completions,

View file

@ -429,6 +429,7 @@ fn escape_help(string: &str) -> String {
.replace(':', "\\:")
.replace('$', "\\$")
.replace('`', "\\`")
.replace('\n', " ")
}
/// Escape value string inside single quotes and parentheses

View file

@ -22,8 +22,7 @@ set edit:completion:arg-completer[my-app] = {|@words|
cand -v 'v'
cand -h 'Print help'
cand --help 'Print help'
cand test 'Subcommand
with a second line'
cand test 'Subcommand with a second line'
cand help 'Print this message or the help of the given subcommand(s)'
}
&'my-app;test'= {
@ -33,8 +32,7 @@ with a second line'
cand --help 'Print help'
}
&'my-app;help'= {
cand test 'Subcommand
with a second line'
cand test 'Subcommand with a second line'
cand help 'Print this message or the help of the given subcommand(s)'
}
&'my-app;help;test'= {

View file

@ -1,12 +1,10 @@
complete -c my-app -n "__fish_use_subcommand" -s c
complete -c my-app -n "__fish_use_subcommand" -s v
complete -c my-app -n "__fish_use_subcommand" -s h -l help -d 'Print help'
complete -c my-app -n "__fish_use_subcommand" -f -a "test" -d 'Subcommand
with a second line'
complete -c my-app -n "__fish_use_subcommand" -f -a "test" -d 'Subcommand with a second line'
complete -c my-app -n "__fish_use_subcommand" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
complete -c my-app -n "__fish_seen_subcommand_from test" -s d
complete -c my-app -n "__fish_seen_subcommand_from test" -s c
complete -c my-app -n "__fish_seen_subcommand_from test" -s h -l help -d 'Print help'
complete -c my-app -n "__fish_seen_subcommand_from help; and not __fish_seen_subcommand_from test; and not __fish_seen_subcommand_from help" -f -a "test" -d 'Subcommand
with a second line'
complete -c my-app -n "__fish_seen_subcommand_from help; and not __fish_seen_subcommand_from test; and not __fish_seen_subcommand_from help" -f -a "test" -d 'Subcommand with a second line'
complete -c my-app -n "__fish_seen_subcommand_from help; and not __fish_seen_subcommand_from test; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'

View file

@ -25,8 +25,7 @@ Register-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {
[CompletionResult]::new('-v', 'v', [CompletionResultType]::ParameterName, 'v')
[CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')
[CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')
[CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand
with a second line')
[CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand with a second line')
[CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')
break
}
@ -38,8 +37,7 @@ with a second line')
break
}
'my-app;help' {
[CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand
with a second line')
[CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand with a second line')
[CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')
break
}

View file

@ -68,8 +68,7 @@ esac
(( $+functions[_my-app_commands] )) ||
_my-app_commands() {
local commands; commands=(
'test:Subcommand
with a second line' \
'test:Subcommand with a second line' \
'help:Print this message or the help of the given subcommand(s)' \
)
_describe -t commands 'my-app commands' commands "$@"
@ -77,8 +76,7 @@ with a second line' \
(( $+functions[_my-app__help_commands] )) ||
_my-app__help_commands() {
local commands; commands=(
'test:Subcommand
with a second line' \
'test:Subcommand with a second line' \
'help:Print this message or the help of the given subcommand(s)' \
)
_describe -t commands 'my-app help commands' commands "$@"

View file

@ -22,8 +22,7 @@ set edit:completion:arg-completer[bin-name] = {|@words|
cand -v 'v'
cand -h 'Print help'
cand --help 'Print help'
cand test 'Subcommand
with a second line'
cand test 'Subcommand with a second line'
cand help 'Print this message or the help of the given subcommand(s)'
}
&'bin-name;test'= {
@ -33,8 +32,7 @@ with a second line'
cand --help 'Print help'
}
&'bin-name;help'= {
cand test 'Subcommand
with a second line'
cand test 'Subcommand with a second line'
cand help 'Print this message or the help of the given subcommand(s)'
}
&'bin-name;help;test'= {

View file

@ -1,12 +1,10 @@
complete -c bin-name -n "__fish_use_subcommand" -s c
complete -c bin-name -n "__fish_use_subcommand" -s v
complete -c bin-name -n "__fish_use_subcommand" -s h -l help -d 'Print help'
complete -c bin-name -n "__fish_use_subcommand" -f -a "test" -d 'Subcommand
with a second line'
complete -c bin-name -n "__fish_use_subcommand" -f -a "test" -d 'Subcommand with a second line'
complete -c bin-name -n "__fish_use_subcommand" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
complete -c bin-name -n "__fish_seen_subcommand_from test" -s d
complete -c bin-name -n "__fish_seen_subcommand_from test" -s c
complete -c bin-name -n "__fish_seen_subcommand_from test" -s h -l help -d 'Print help'
complete -c bin-name -n "__fish_seen_subcommand_from help; and not __fish_seen_subcommand_from test; and not __fish_seen_subcommand_from help" -f -a "test" -d 'Subcommand
with a second line'
complete -c bin-name -n "__fish_seen_subcommand_from help; and not __fish_seen_subcommand_from test; and not __fish_seen_subcommand_from help" -f -a "test" -d 'Subcommand with a second line'
complete -c bin-name -n "__fish_seen_subcommand_from help; and not __fish_seen_subcommand_from test; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'

View file

@ -25,8 +25,7 @@ Register-ArgumentCompleter -Native -CommandName 'bin-name' -ScriptBlock {
[CompletionResult]::new('-v', 'v', [CompletionResultType]::ParameterName, 'v')
[CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')
[CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')
[CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand
with a second line')
[CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand with a second line')
[CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')
break
}
@ -38,8 +37,7 @@ with a second line')
break
}
'bin-name;help' {
[CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand
with a second line')
[CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand with a second line')
[CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')
break
}

View file

@ -68,8 +68,7 @@ esac
(( $+functions[_bin-name_commands] )) ||
_bin-name_commands() {
local commands; commands=(
'test:Subcommand
with a second line' \
'test:Subcommand with a second line' \
'help:Print this message or the help of the given subcommand(s)' \
)
_describe -t commands 'bin-name commands' commands "$@"
@ -77,8 +76,7 @@ with a second line' \
(( $+functions[_bin-name__help_commands] )) ||
_bin-name__help_commands() {
local commands; commands=(
'test:Subcommand
with a second line' \
'test:Subcommand with a second line' \
'help:Print this message or the help of the given subcommand(s)' \
)
_describe -t commands 'bin-name help commands' commands "$@"

View file

@ -66,8 +66,7 @@ set edit:completion:arg-completer[exhaustive] = {|@words|
cand cmd-backslash 'Avoid ''\n'''
cand cmd-brackets 'List packages [filter]'
cand cmd-expansions 'Execute the shell command with $SHELL'
cand escape-help '\tab "''
New Line'
cand escape-help '\tab "'' New Line'
cand help 'Print this message or the help of the given subcommand(s)'
}
&'exhaustive;quote;cmd-single-quotes'= {
@ -126,8 +125,7 @@ New Line'
cand cmd-backslash 'Avoid ''\n'''
cand cmd-brackets 'List packages [filter]'
cand cmd-expansions 'Execute the shell command with $SHELL'
cand escape-help '\tab "''
New Line'
cand escape-help '\tab "'' New Line'
cand help 'Print this message or the help of the given subcommand(s)'
}
&'exhaustive;quote;help;cmd-single-quotes'= {
@ -269,8 +267,7 @@ New Line'
cand cmd-backslash 'Avoid ''\n'''
cand cmd-brackets 'List packages [filter]'
cand cmd-expansions 'Execute the shell command with $SHELL'
cand escape-help '\tab "''
New Line'
cand escape-help '\tab "'' New Line'
}
&'exhaustive;help;quote;cmd-single-quotes'= {
}

View file

@ -34,8 +34,7 @@ complete -c exhaustive -n "__fish_seen_subcommand_from quote; and not __fish_see
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "cmd-backslash" -d 'Avoid \'\\n\''
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "cmd-brackets" -d 'List packages [filter]'
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "cmd-expansions" -d 'Execute the shell command with $SHELL'
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "escape-help" -d '\\tab "\'
New Line'
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "escape-help" -d '\\tab "\' New Line'
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and __fish_seen_subcommand_from cmd-single-quotes" -l global -d 'everywhere'
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and __fish_seen_subcommand_from cmd-single-quotes" -s h -l help -d 'Print help'
@ -64,8 +63,7 @@ complete -c exhaustive -n "__fish_seen_subcommand_from quote; and __fish_seen_su
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and __fish_seen_subcommand_from help; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "cmd-backslash" -d 'Avoid \'\\n\''
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and __fish_seen_subcommand_from help; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "cmd-brackets" -d 'List packages [filter]'
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and __fish_seen_subcommand_from help; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "cmd-expansions" -d 'Execute the shell command with $SHELL'
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and __fish_seen_subcommand_from help; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "escape-help" -d '\\tab "\'
New Line'
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and __fish_seen_subcommand_from help; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "escape-help" -d '\\tab "\' New Line'
complete -c exhaustive -n "__fish_seen_subcommand_from quote; and __fish_seen_subcommand_from help; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
complete -c exhaustive -n "__fish_seen_subcommand_from value" -l delim -r
complete -c exhaustive -n "__fish_seen_subcommand_from value" -l tuple -r
@ -132,7 +130,6 @@ complete -c exhaustive -n "__fish_seen_subcommand_from help; and __fish_seen_sub
complete -c exhaustive -n "__fish_seen_subcommand_from help; and __fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help" -f -a "cmd-backslash" -d 'Avoid \'\\n\''
complete -c exhaustive -n "__fish_seen_subcommand_from help; and __fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help" -f -a "cmd-brackets" -d 'List packages [filter]'
complete -c exhaustive -n "__fish_seen_subcommand_from help; and __fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help" -f -a "cmd-expansions" -d 'Execute the shell command with $SHELL'
complete -c exhaustive -n "__fish_seen_subcommand_from help; and __fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help" -f -a "escape-help" -d '\\tab "\'
New Line'
complete -c exhaustive -n "__fish_seen_subcommand_from help; and __fish_seen_subcommand_from quote; and not __fish_seen_subcommand_from cmd-single-quotes; and not __fish_seen_subcommand_from cmd-double-quotes; and not __fish_seen_subcommand_from cmd-backticks; and not __fish_seen_subcommand_from cmd-backslash; and not __fish_seen_subcommand_from cmd-brackets; and not __fish_seen_subcommand_from cmd-expansions; and not __fish_seen_subcommand_from escape-help" -f -a "escape-help" -d '\\tab "\' New Line'
complete -c exhaustive -n "__fish_seen_subcommand_from help; and __fish_seen_subcommand_from pacman; and not __fish_seen_subcommand_from one; and not __fish_seen_subcommand_from two" -f -a "one"
complete -c exhaustive -n "__fish_seen_subcommand_from help; and __fish_seen_subcommand_from pacman; and not __fish_seen_subcommand_from one; and not __fish_seen_subcommand_from two" -f -a "two"

View file

@ -645,8 +645,7 @@ _exhaustive__quote__help_commands() {
'cmd-backslash:Avoid '\''\\n'\''' \
'cmd-brackets:List packages \[filter\]' \
'cmd-expansions:Execute the shell command with \$SHELL' \
'escape-help:\\tab "'\''
New Line' \
'escape-help:\\tab "'\'' New Line' \
'help:Print this message or the help of the given subcommand(s)' \
)
_describe -t commands 'exhaustive quote help commands' commands "$@"
@ -717,8 +716,7 @@ _exhaustive__help__quote_commands() {
'cmd-backslash:Avoid '\''\\n'\''' \
'cmd-brackets:List packages \[filter\]' \
'cmd-expansions:Execute the shell command with \$SHELL' \
'escape-help:\\tab "'\''
New Line' \
'escape-help:\\tab "'\'' New Line' \
)
_describe -t commands 'exhaustive help quote commands' commands "$@"
}
@ -731,8 +729,7 @@ _exhaustive__quote_commands() {
'cmd-backslash:Avoid '\''\\n'\''' \
'cmd-brackets:List packages \[filter\]' \
'cmd-expansions:Execute the shell command with \$SHELL' \
'escape-help:\\tab "'\''
New Line' \
'escape-help:\\tab "'\'' New Line' \
'help:Print this message or the help of the given subcommand(s)' \
)
_describe -t commands 'exhaustive quote commands' commands "$@"

View file

@ -19,6 +19,7 @@
#![warn(missing_docs, trivial_casts, unused_allocation, trivial_numeric_casts)]
#![forbid(unsafe_code)]
use clap::builder::StyledStr;
use clap::{builder::PossibleValue, Arg, ArgAction, Command};
use clap_complete::Generator;
@ -75,7 +76,7 @@ fn append_value_completion_and_help(
None => 0,
};
s.push_str(format!("{:>width$}# {}", ' ', help).as_str());
s.push_str(format!("{:>width$}# {}", ' ', single_line_styled_str(help)).as_str());
}
s.push('\n');
@ -180,6 +181,7 @@ fn generate_completion(completions: &mut String, cmd: &Command, is_subcommand: b
}
if let Some(about) = cmd.get_about() {
let about = single_line_styled_str(about);
completions.push_str(format!(" # {about}\n").as_str());
}
@ -201,3 +203,7 @@ fn generate_completion(completions: &mut String, cmd: &Command, is_subcommand: b
}
}
}
fn single_line_styled_str(text: &StyledStr) -> String {
text.to_string().replace('\n', " ")
}

View file

@ -6,8 +6,7 @@ module completions {
--help(-h) # Print help
]
# Subcommand
with a second line
# Subcommand with a second line
export extern "my-app test" [
-d
-c
@ -18,8 +17,7 @@ with a second line
export extern "my-app help" [
]
# Subcommand
with a second line
# Subcommand with a second line
export extern "my-app help test" [
]

View file

@ -7,12 +7,9 @@ module completions {
# Tests completions
export extern my-app [
file?: string # some input file
--config(-c) # some config file
with another line
--conf # some config file
with another line
-C # some config file
with another line
--config(-c) # some config file with another line
--conf # some config file with another line
-C # some config file with another line
choice?: string@"nu-complete my-app choice"
--help(-h) # Print help
--version(-V) # Print version

View file

@ -7,12 +7,9 @@ module completions {
# Tests completions
export extern my-app [
file?: string # some input file
--config(-c) # some config file
with another line
--conf # some config file
with another line
-C # some config file
with another line
--config(-c) # some config file with another line
--conf # some config file with another line
-C # some config file with another line
choice?: string@"nu-complete my-app choice"
--help(-h) # Print help
--version(-V) # Print version

View file

@ -7,12 +7,9 @@ module completions {
# Tests completions
export extern my-app [
file?: string # some input file
--config(-c) # some config file
with another line
--conf # some config file
with another line
-C # some config file
with another line
--config(-c) # some config file with another line
--conf # some config file with another line
-C # some config file with another line
choice?: string@"nu-complete my-app choice"
--help(-h) # Print help
--version(-V) # Print version