diff --git a/.changeset/young-radios-fly.md b/.changeset/young-radios-fly.md new file mode 100644 index 0000000000..c68a070c82 --- /dev/null +++ b/.changeset/young-radios-fly.md @@ -0,0 +1,5 @@ +--- +"@pnpm/plugin-commands-completion": patch +--- + +Give correct suggestions when command line ends with a space. #[10607](https://github.com/pnpm/pnpm/pull/10607/changes) diff --git a/completion/plugin-commands-completion/src/completionServer.ts b/completion/plugin-commands-completion/src/completionServer.ts index 0d8f931f09..92cd152c36 100644 --- a/completion/plugin-commands-completion/src/completionServer.ts +++ b/completion/plugin-commands-completion/src/completionServer.ts @@ -26,10 +26,7 @@ export function createCompletionServer ( const env = tabtab.parseEnv(process.env) if (!env.complete) return - // Parse only words that are before the pointer and finished. - // Finished means that there's at least one space between the word and pointer - const finishedArgv = env.partial.slice(0, -env.lastPartial.length) - const inputArgv = splitCmd(finishedArgv).slice(1) + const inputArgv = splitCmd(stripPartialWord(env)).slice(1) // We cannot autocomplete what a user types after "pnpm test --" if (inputArgv.includes('--')) return const { params, options, cmd } = await opts.parseCliArgs(inputArgv) @@ -48,3 +45,14 @@ export function createCompletionServer ( ) } } + +/** + * Returns the portion of the command line that consists of fully typed words, + */ +function stripPartialWord (env: { partial: string, lastPartial: string }): string { + if (env.lastPartial.length > 0) { + // stripping any word the user is currently typing. + return env.partial.slice(0, -env.lastPartial.length) + } + return env.partial +} \ No newline at end of file