Skip to content

Commit

Permalink
fix: Escape special characters properly for zsh
Browse files Browse the repository at this point in the history
Signed-off-by: Huan-Cheng Chang <changhc84@gmail.com>
  • Loading branch information
changhc committed Apr 20, 2023
1 parent 65e5a70 commit a379bae
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 6 deletions.
31 changes: 31 additions & 0 deletions clap_complete/src/shells/zsh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -426,13 +426,21 @@ fn escape_help(string: &str) -> String {
.replace('\'', "'\\''")
.replace('[', "\\[")
.replace(']', "\\]")
.replace(':', "\\:")
.replace('$', "\\$")
.replace('`', "\\`")
}

/// Escape value string inside single quotes and parentheses
fn escape_value(string: &str) -> String {
string
.replace('\\', "\\\\")
.replace('\'', "'\\''")
.replace('[', "\\[")
.replace(']', "\\]")
.replace(':', "\\:")
.replace('$', "\\$")
.replace('`', "\\`")
.replace('(', "\\(")
.replace(')', "\\)")
.replace(' ', "\\ ")
Expand Down Expand Up @@ -688,3 +696,26 @@ fn write_positionals_of(p: &Command) -> String {

ret.join("\n")
}

#[cfg(test)]
mod tests {
use crate::shells::zsh::{escape_help, escape_value};

#[test]
fn test_escape_value() {
let raw_string = "\\ [foo]() `bar https://$PATH";
assert_eq!(
escape_value(raw_string),
"\\\\\\ \\[foo\\]\\(\\)\\ \\`bar\\ https\\://\\$PATH"
)
}

#[test]
fn test_escape_help() {
let raw_string = "\\ [foo]() `bar https://$PATH";
assert_eq!(
escape_help(raw_string),
"\\\\ \\[foo\\]() \\`bar https\\://\\$PATH"
)
}
}
12 changes: 6 additions & 6 deletions clap_complete/tests/snapshots/quoting.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ _my-app() {
_arguments "${_arguments_options[@]}" \
'--single-quotes[Can be '\''always'\'', '\''auto'\'', or '\''never'\'']' \
'--double-quotes[Can be "always", "auto", or "never"]' \
'--backticks[For more information see `echo test`]' \
'--backticks[For more information see \`echo test\`]' \
'--backslash[Avoid '\''\\n'\'']' \
'--brackets[List packages \[filter\]]' \
'--expansions[Execute the shell command with $SHELL]' \
'--expansions[Execute the shell command with \$SHELL]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
Expand Down Expand Up @@ -124,10 +124,10 @@ _my-app_commands() {
local commands; commands=(
'cmd-single-quotes:Can be '\''always'\'', '\''auto'\'', or '\''never'\''' \
'cmd-double-quotes:Can be "always", "auto", or "never"' \
'cmd-backticks:For more information see `echo test`' \
'cmd-backticks:For more information see \`echo test\`' \
'cmd-backslash:Avoid '\''\\n'\''' \
'cmd-brackets:List packages \[filter\]' \
'cmd-expansions:Execute the shell command with $SHELL' \
'cmd-expansions:Execute the shell command with \$SHELL' \
'help:Print this message or the help of the given subcommand(s)' \
)
_describe -t commands 'my-app commands' commands "$@"
Expand Down Expand Up @@ -197,10 +197,10 @@ _my-app__help_commands() {
local commands; commands=(
'cmd-single-quotes:Can be '\''always'\'', '\''auto'\'', or '\''never'\''' \
'cmd-double-quotes:Can be "always", "auto", or "never"' \
'cmd-backticks:For more information see `echo test`' \
'cmd-backticks:For more information see \`echo test\`' \
'cmd-backslash:Avoid '\''\\n'\''' \
'cmd-brackets:List packages \[filter\]' \
'cmd-expansions:Execute the shell command with $SHELL' \
'cmd-expansions:Execute the shell command with \$SHELL' \
'help:Print this message or the help of the given subcommand(s)' \
)
_describe -t commands 'my-app help commands' commands "$@"
Expand Down

0 comments on commit a379bae

Please sign in to comment.