1
2using namespace System.Management.Automation
3using namespace System.Management.Automation.Language
4
5Register-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {
6    param($wordToComplete, $commandAst, $cursorPosition)
7
8    $commandElements = $commandAst.CommandElements
9    $command = @(
10        'my-app'
11        for ($i = 1; $i -lt $commandElements.Count; $i++) {
12            $element = $commandElements[$i]
13            if ($element -isnot [StringConstantExpressionAst] -or
14                $element.StringConstantType -ne [StringConstantType]::BareWord -or
15                $element.Value.StartsWith('-') -or
16                $element.Value -eq $wordToComplete) {
17                break
18        }
19        $element.Value
20    }) -join ';'
21
22    $completions = @(switch ($command) {
23        'my-app' {
24            [CompletionResult]::new('--single-quotes', 'single-quotes', [CompletionResultType]::ParameterName, 'Can be ''always'', ''auto'', or ''never''')
25            [CompletionResult]::new('--double-quotes', 'double-quotes', [CompletionResultType]::ParameterName, 'Can be "always", "auto", or "never"')
26            [CompletionResult]::new('--backticks', 'backticks', [CompletionResultType]::ParameterName, 'For more information see `echo test`')
27            [CompletionResult]::new('--backslash', 'backslash', [CompletionResultType]::ParameterName, 'Avoid ''\n''')
28            [CompletionResult]::new('--brackets', 'brackets', [CompletionResultType]::ParameterName, 'List packages [filter]')
29            [CompletionResult]::new('--expansions', 'expansions', [CompletionResultType]::ParameterName, 'Execute the shell command with $SHELL')
30            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')
31            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')
32            [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Print version')
33            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')
34            [CompletionResult]::new('cmd-single-quotes', 'cmd-single-quotes', [CompletionResultType]::ParameterValue, 'Can be ''always'', ''auto'', or ''never''')
35            [CompletionResult]::new('cmd-double-quotes', 'cmd-double-quotes', [CompletionResultType]::ParameterValue, 'Can be "always", "auto", or "never"')
36            [CompletionResult]::new('cmd-backticks', 'cmd-backticks', [CompletionResultType]::ParameterValue, 'For more information see `echo test`')
37            [CompletionResult]::new('cmd-backslash', 'cmd-backslash', [CompletionResultType]::ParameterValue, 'Avoid ''\n''')
38            [CompletionResult]::new('cmd-brackets', 'cmd-brackets', [CompletionResultType]::ParameterValue, 'List packages [filter]')
39            [CompletionResult]::new('cmd-expansions', 'cmd-expansions', [CompletionResultType]::ParameterValue, 'Execute the shell command with $SHELL')
40            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')
41            break
42        }
43        'my-app;cmd-single-quotes' {
44            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')
45            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')
46            break
47        }
48        'my-app;cmd-double-quotes' {
49            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')
50            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')
51            break
52        }
53        'my-app;cmd-backticks' {
54            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')
55            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')
56            break
57        }
58        'my-app;cmd-backslash' {
59            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')
60            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')
61            break
62        }
63        'my-app;cmd-brackets' {
64            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')
65            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')
66            break
67        }
68        'my-app;cmd-expansions' {
69            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')
70            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')
71            break
72        }
73        'my-app;help' {
74            [CompletionResult]::new('cmd-single-quotes', 'cmd-single-quotes', [CompletionResultType]::ParameterValue, 'Can be ''always'', ''auto'', or ''never''')
75            [CompletionResult]::new('cmd-double-quotes', 'cmd-double-quotes', [CompletionResultType]::ParameterValue, 'Can be "always", "auto", or "never"')
76            [CompletionResult]::new('cmd-backticks', 'cmd-backticks', [CompletionResultType]::ParameterValue, 'For more information see `echo test`')
77            [CompletionResult]::new('cmd-backslash', 'cmd-backslash', [CompletionResultType]::ParameterValue, 'Avoid ''\n''')
78            [CompletionResult]::new('cmd-brackets', 'cmd-brackets', [CompletionResultType]::ParameterValue, 'List packages [filter]')
79            [CompletionResult]::new('cmd-expansions', 'cmd-expansions', [CompletionResultType]::ParameterValue, 'Execute the shell command with $SHELL')
80            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')
81            break
82        }
83        'my-app;help;cmd-single-quotes' {
84            break
85        }
86        'my-app;help;cmd-double-quotes' {
87            break
88        }
89        'my-app;help;cmd-backticks' {
90            break
91        }
92        'my-app;help;cmd-backslash' {
93            break
94        }
95        'my-app;help;cmd-brackets' {
96            break
97        }
98        'my-app;help;cmd-expansions' {
99            break
100        }
101        'my-app;help;help' {
102            break
103        }
104    })
105
106    $completions.Where{ $_.CompletionText -like "$wordToComplete*" } |
107        Sort-Object -Property ListItemText
108}
109