Repository: clap-rs/clap
Pull request #5732 (2024-09-17 20:16:41)

docs(complete): Clarify CompleteEnv's Shell trait
<!--
Thanks for helping out!

Please link the appropriate issue from your PR.

If you don't have an issue, we'd recommend starting with one first so the PR can focus on the
implementation (unless its an obvious bug or documentation fix that will have
little conversation).
-->



Patch:
diff --git a/clap_complete/src/env/mod.rs b/clap_complete/src/env/mod.rs
index 69e0b1d7..aa5a7964 100644
--- a/clap_complete/src/env/mod.rs
+++ b/clap_complete/src/env/mod.rs
@@ -295,6 +295,11 @@ pub trait EnvCompleter {
     /// Write the `buf` the logic needed for calling into `<VAR>=<shell> <cmd> --`, passing needed
     /// arguments to [`EnvCompleter::write_complete`] through the environment.
     ///
+    /// - `var`: see [`CompleteEnv::var`]
+    /// - `name`: an identifier to use in the script
+    /// - `bin`: the binary being completed
+    /// - `completer`: the command to run to generate completions
+    ///
     /// **WARNING:** There are no stability guarantees between the call to
     /// [`EnvCompleter::write_complete`] that this generates and actually calling [`EnvCompleter::write_complete`].
     /// Caching the results of this call may result in invalid or no completions to be generated.
diff --git a/clap_complete/src/env/shells.rs b/clap_complete/src/env/shells.rs
index 1b71c8dd..521cb43e 100644
--- a/clap_complete/src/env/shells.rs
+++ b/clap_complete/src/env/shells.rs
@@ -23,8 +23,6 @@ impl EnvCompleter for Bash {
         buf: &mut dyn std::io::Write,
     ) -> Result<(), std::io::Error> {
         let escaped_name = name.replace('-', "_");
-        let mut upper_name = escaped_name.clone();
-        upper_name.make_ascii_uppercase();
 
         let completer =
             shlex::try_quote(completer).unwrap_or(std::borrow::Cow::Borrowed(completer));
@@ -61,7 +59,6 @@ fi
         .replace("NAME", &escaped_name)
         .replace("BIN", bin)
         .replace("COMPLETER", &completer)
-        .replace("UPPER", &upper_name)
         .replace("VAR", var);
 
         writeln!(buf, "{script}")?;
@@ -341,17 +338,18 @@ impl EnvCompleter for Zsh {
     fn write_registration(
         &self,
         var: &str,
-        _name: &str,
+        name: &str,
         bin: &str,
         completer: &str,
         buf: &mut dyn std::io::Write,
     ) -> Result<(), std::io::Error> {
+        let escaped_name = name.replace('-', "_");
         let bin = shlex::try_quote(bin).unwrap_or(std::borrow::Cow::Borrowed(bin));
         let completer =
             shlex::try_quote(completer).unwrap_or(std::borrow::Cow::Borrowed(completer));
 
         let script = r#"#compdef BIN
-function _clap_dynamic_completer() {
+function _clap_dynamic_completer_NAME() {
     local _CLAP_COMPLETE_INDEX=$(expr $CURRENT - 1)
     local _CLAP_IFS=$'\n'
 
@@ -367,7 +365,8 @@ function _clap_dynamic_completer() {
     fi
 }
 
-compdef _clap_dynamic_completer BIN"#
+compdef _clap_dynamic_completer_NAME BIN"#
+            .replace("NAME", &escaped_name)
             .replace("COMPLETER", &completer)
             .replace("BIN", &bin)
             .replace("VAR", var);


Test patch:
diff --git a/clap_complete/tests/snapshots/home/dynamic-env/exhaustive/zsh/zsh/_exhaustive b/clap_complete/tests/snapshots/home/dynamic-env/exhaustive/zsh/zsh/_exhaustive
index b280f7c6..e59950fc 100644
--- a/clap_complete/tests/snapshots/home/dynamic-env/exhaustive/zsh/zsh/_exhaustive
+++ b/clap_complete/tests/snapshots/home/dynamic-env/exhaustive/zsh/zsh/_exhaustive
@@ -1,5 +1,5 @@
 #compdef exhaustive
-function _clap_dynamic_completer() {
+function _clap_dynamic_completer_exhaustive() {
     local _CLAP_COMPLETE_INDEX=$(expr $CURRENT - 1)
     local _CLAP_IFS=$'\n'
 
@@ -15,4 +15,4 @@ function _clap_dynamic_completer() {
     fi
 }
 
-compdef _clap_dynamic_completer exhaustive
+compdef _clap_dynamic_completer_exhaustive exhaustive