diff options
| author | sigoden <sigoden@gmail.com> | 2024-04-13 19:50:10 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-13 19:50:10 +0800 |
| commit | 1c3e81afe9f63fb47303384a82c7239458166f52 (patch) | |
| tree | 85d89be89fe9347cf4e8b8cbf30993e5d85c38f8 /scripts/completions/aichat.ps1 | |
| parent | 568e9a06db7189a28f9346802356b3fd4bdf921b (diff) | |
| download | aichat-1c3e81afe9f63fb47303384a82c7239458166f52.tar.gz | |
feat: add completion scripts (#411)
Diffstat (limited to 'scripts/completions/aichat.ps1')
| -rw-r--r-- | scripts/completions/aichat.ps1 | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/scripts/completions/aichat.ps1 b/scripts/completions/aichat.ps1 new file mode 100644 index 0000000..7d5a7cf --- /dev/null +++ b/scripts/completions/aichat.ps1 @@ -0,0 +1,79 @@ +using namespace System.Management.Automation +using namespace System.Management.Automation.Language + +Register-ArgumentCompleter -Native -CommandName 'aichat' -ScriptBlock { + param($wordToComplete, $commandAst, $cursorPosition) + + $commandElements = $commandAst.CommandElements + $command = @( + 'aichat' + for ($i = 1; $i -lt $commandElements.Count; $i++) { + $element = $commandElements[$i] + if ($element -isnot [StringConstantExpressionAst] -or + $element.StringConstantType -ne [StringConstantType]::BareWord -or + $element.Value.StartsWith('-') -or + $element.Value -eq $wordToComplete) { + break + } + $element.Value + }) -join ';' + + $completions = @(switch ($command) { + 'aichat' { + [CompletionResult]::new('-m', '-m', [CompletionResultType]::ParameterName, 'Choose a LLM model') + [CompletionResult]::new('--model', '--model', [CompletionResultType]::ParameterName, 'Choose a LLM model') + [CompletionResult]::new('-r', '-r', [CompletionResultType]::ParameterName, 'Choose a role') + [CompletionResult]::new('--role', '--role', [CompletionResultType]::ParameterName, 'Choose a role') + [CompletionResult]::new('-s', '-s', [CompletionResultType]::ParameterName, 'Create or reuse a session') + [CompletionResult]::new('--session', '--session', [CompletionResultType]::ParameterName, 'Create or reuse a session') + [CompletionResult]::new('-f', '-f', [CompletionResultType]::ParameterName, 'Attach files to the message') + [CompletionResult]::new('--file', '--file', [CompletionResultType]::ParameterName, 'Attach files to the message') + [CompletionResult]::new('-w', '-w', [CompletionResultType]::ParameterName, 'Specify the text-wrapping mode (no, auto, <max-width>)') + [CompletionResult]::new('--wrap', '--wrap', [CompletionResultType]::ParameterName, 'Specify the text-wrapping mode (no, auto, <max-width>)') + [CompletionResult]::new('--save-session', '--save-session', [CompletionResultType]::ParameterName, 'Whether to save the session') + [CompletionResult]::new('-e', '-e', [CompletionResultType]::ParameterName, 'Execute commands using natural language') + [CompletionResult]::new('--execute', '--execute', [CompletionResultType]::ParameterName, 'Execute commands using natural language') + [CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'Generate only code') + [CompletionResult]::new('--code', '--code', [CompletionResultType]::ParameterName, 'Generate only code') + [CompletionResult]::new('-H', '-H', [CompletionResultType]::ParameterName, 'Disable syntax highlighting') + [CompletionResult]::new('--no-highlight', '--no-highlight', [CompletionResultType]::ParameterName, 'Disable syntax highlighting') + [CompletionResult]::new('-S', '-S', [CompletionResultType]::ParameterName, 'No stream output') + [CompletionResult]::new('--no-stream', '--no-stream', [CompletionResultType]::ParameterName, 'No stream output') + [CompletionResult]::new('--light-theme', '--light-theme', [CompletionResultType]::ParameterName, 'Use light theme') + [CompletionResult]::new('--dry-run', '--dry-run', [CompletionResultType]::ParameterName, 'Run in dry run mode') + [CompletionResult]::new('--info', '--info', [CompletionResultType]::ParameterName, 'Print related information') + [CompletionResult]::new('--list-models', '--list-models', [CompletionResultType]::ParameterName, 'List all available models') + [CompletionResult]::new('--list-roles', '--list-roles', [CompletionResultType]::ParameterName, 'List all available roles') + [CompletionResult]::new('--list-sessions', '--list-sessions', [CompletionResultType]::ParameterName, 'List all available sessions') + [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help') + [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help') + [CompletionResult]::new('-V', '-V', [CompletionResultType]::ParameterName, 'Print version') + [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version') + break + } + }) + + function Get-AichatValues($arg) { + $(aichat $arg) -split '\n' | ForEach-Object { [CompletionResult]::new($_) } + } + + if ($commandElements.Count -gt 1) { + $offset=2 + if ($wordToComplete -eq "") { + $offset=1 + } + $flag = $commandElements[$commandElements.Count-$offset].ToString() + if ($flag -eq "-m" -or $flag -eq "--model") { + $completions = Get-AichatValues "--list-models" + } elseif ($flag -eq "-r" -or $flag -eq "--role") { + $completions = Get-AichatValues "--list-roles" + } elseif ($flag -eq "-s" -or $flag -eq "--session") { + $completions = Get-AichatValues "--list-sessions" + } elseif ($flag -eq "-f" -or $flag -eq "--file") { + $completions = @() + } + } + + $completions.Where{ $_.CompletionText -like "$wordToComplete*" } | + Sort-Object -Property ListItemText +} |
