












@@ -56,27 +56,44 @@ function fishOptionFlags(options: Command["options"], wantsValue: boolean): stri
5656});
5757}
585859-function collectFishOptionFlags(program: Command, wantsValue: boolean): string[] {
60-const flags = new Set<string>();
61-const visit = (cmd: Command) => {
62-for (const flag of fishOptionFlags(cmd.options, wantsValue)) {
63-flags.add(flag);
59+function collectFishPathOptionFlags(
60+program: Command,
61+parents: readonly string[],
62+wantsValue: boolean,
63+): string[] {
64+const flags = new Set(fishOptionFlags(program.options, wantsValue));
65+let current: Command | undefined = program;
66+for (const name of parents) {
67+current = current?.commands.find((cmd) => cmd.name() === name);
68+if (!current) {
69+break;
6470}
65-for (const child of cmd.commands) {
66-visit(child);
71+for (const flag of fishOptionFlags(current.options, wantsValue)) {
72+flags.add(flag);
6773}
68-};
69-visit(program);
74+}
7075return [...flags];
7176}
727773-function generateFishPathHelper(program: Command, rootCmd: string): string {
74-const valueOptions = collectFishOptionFlags(program, true);
78+function generateFishPathHelper(rootCmd: string): string {
7579return `
7680function __${rootCmd}_command_path_matches
81+ set -l expected
82+ set -l value_options
83+ set -l reading_value_options 0
84+ for arg in $argv
85+ if test "$arg" = "--"
86+ set reading_value_options 1
87+ continue
88+ end
89+ if test $reading_value_options -eq 1
90+ set -a value_options $arg
91+ else
92+ set -a expected $arg
93+ end
94+ end
7795 set -l tokens (commandline -opc)
7896 set -e tokens[1]
79- set -l value_options ${fishWords(valueOptions)}
8097 set -l command_tokens
8198 set -l skip_next 0
8299 for token in $tokens
@@ -96,8 +113,8 @@ function __${rootCmd}_command_path_matches
96113 end
97114 set -a command_tokens $token
98115 end
99- for i in (seq (count $argv))
100- if test "$command_tokens[$i]" != "$argv[$i]"
116+ for i in (seq (count $expected))
117+ if test "$command_tokens[$i]" != "$expected[$i]"
101118 return 1
102119 end
103120 end
@@ -106,8 +123,13 @@ end
106123`;
107124}
108125109-function fishCommandPathCondition(rootCmd: string, parents: readonly string[]): string {
110-return `__${rootCmd}_command_path_matches ${parents.join(" ")}`;
126+function fishCommandPathCondition(
127+program: Command,
128+rootCmd: string,
129+parents: readonly string[],
130+): string {
131+const valueOptions = collectFishPathOptionFlags(program, parents, true);
132+return `__${rootCmd}_command_path_matches ${parents.join(" ")} -- ${fishWords(valueOptions)}`.trimEnd();
111133}
112134113135async function writeCompletionCache(params: {
@@ -452,7 +474,7 @@ Register-ArgumentCompleter -Native -CommandName ${rootCmd} -ScriptBlock {
452474453475function generateFishCompletion(program: Command): string {
454476const rootCmd = program.name();
455-const segments: string[] = [generateFishPathHelper(program, rootCmd)];
477+const segments: string[] = [generateFishPathHelper(rootCmd)];
456478457479const visit = (cmd: Command, parents: string[]) => {
458480// Root logic
@@ -480,7 +502,7 @@ function generateFishCompletion(program: Command): string {
480502);
481503}
482504} else {
483-const condition = fishCommandPathCondition(rootCmd, parents);
505+const condition = fishCommandPathCondition(program, rootCmd, parents);
484506// Subcommands
485507for (const sub of cmd.commands) {
486508segments.push(
此內容由慣性聚合(RSS閱讀器)自動聚合整理,僅供閱讀參考。 原文來自 — 版權歸原作者所有。