diff --git a/src/complete.rs b/src/complete.rs index 8975b2de6..4a679d72a 100644 --- a/src/complete.rs +++ b/src/complete.rs @@ -1953,19 +1953,16 @@ fn complete_custom(&mut self, cmd: &wstr, cmdline: &wstr, ad: &mut CustomArgData // Perhaps set a transient commandline so that custom completions // builtin_commandline will refer to the wrapped command. But not if // we're doing autosuggestions. - let mut _remove_transient = None; - let wants_transient = - (ad.wrap_depth > 0 || !ad.var_assignments.is_empty()) && !is_autosuggest; - if wants_transient { + let _remove_transient = (!is_autosuggest).then(|| { let parser = self.ctx.parser(); let saved_transient = parser .libdata_mut() .transient_commandline .replace(cmdline.to_owned()); - _remove_transient = Some(ScopeGuard::new((), move |_| { + ScopeGuard::new((), move |_| { parser.libdata_mut().transient_commandline = saved_transient; - })); - } + }) + }); // Maybe apply variable assignments. let _restore_vars = self.apply_var_assignments(ad.var_assignments); diff --git a/tests/pexpects/complete.py b/tests/pexpects/complete.py index 843d4d192..ce432f40b 100644 --- a/tests/pexpects/complete.py +++ b/tests/pexpects/complete.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -from pexpect_helper import SpawnedProc +from pexpect_helper import SpawnedProc, control sp = SpawnedProc() send, sendline, sleep, expect_prompt, expect_re, expect_str = ( @@ -78,3 +78,15 @@ sendline("echo bar") expect_re("\n.*bar") sendline("echo fo\t") expect_re("foooo") + +# Custom completions that access the command line. +sendline("complete -e :; complete : -a '(echo (commandline -ct)-completed)'") +send(": abcd" + control("b") * 2 + "\t") +expect_str(": abcd-completed") +send(control("u")) +# Another one. +sendline("mkdir -p foo/bar; touch foo/bar/baz.fish") +send("source foo/b/baz.fish") +send(control("b") * 9 + "\t") +expect_str("source foo/bar/baz.fish") +send(control("u"))