SKILL.md
.NET CLI Tab Completion
Enable tab autocomplete for the dotnet CLI in your preferred shell.
Steps
- Determine .NET version (CRITICAL - commands differ by version)
``bash dotnet sdk check ` - Parse output to identify installed SDK versions - .NET 10+: Uses dotnet completions script <shell> (native completions) - Pre-.NET 10: Uses dotnet complete --position` (dynamic completions)
- Ask user which shells they use, allowing multi-select:
- PowerShell - bash - zsh - fish - nushell
For each user shell:
- Detect profile file location based on shell:
| Shell | Profile Path |
|---|---|
| PowerShell | $PROFILE |
| bash | ~/.bashrc |
| zsh | ~/.zshrc |
| fish | ~/.config/fish/config.fish |
| nushell | ~/.config/nushell/config.nu |
- Check if completion already configured
- Read the profile file - Search for existing dotnet completion setup - If found, inform user and ask if they want to replace it
- Append completion script to profile based on .NET version and shell
- Inform user to restart their shell or source the profile
Completion Scripts
.NET 10+ (Native Completions)
PowerShell:
dotnet completions script pwsh | Out-String | Invoke-Expression
bash:
eval "$(dotnet completions script bash)"
zsh:
eval "$(dotnet completions script zsh)"
fish:
dotnet completions script fish | source
nushell: See .NET CLI docs for config.nu setup.
Pre-.NET 10 (Dynamic Completions)
PowerShell:
# dotnet CLI tab completion
Register-ArgumentCompleter -Native -CommandName dotnet -ScriptBlock {
param($wordToComplete, $commandAst, $cursorPosition)
dotnet complete --position $cursorPosition "$commandAst" | ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
}
}
bash:
# dotnet CLI tab completion
_dotnet_bash_complete() {
local cur="${COMP_WORDS[COMP_CWORD]}"
local IFS=$'\n'
local candidates
read -d '' -ra candidates < <(dotnet complete --position "${COMP_POINT}" "${COMP_LINE}" 2>/dev/null)
read -d '' -ra COMPREPLY < <(compgen -W "${candidates[*]}" -- "$cur")
}
complete -f -F _dotnet_bash_complete dotnet
zsh:
# dotnet CLI tab completion
_dotnet_zsh_complete() {
local completions=("$(dotnet complete --position ${CURSOR} "${BUFFER}" 2>/dev/null)")
reply=("${(ps:\n:)completions}")
}
compctl -K _dotnet_zsh_complete dotnet
fish:
# dotnet CLI tab completion
complete -f -c dotnet -a "(dotnet complete --position (commandline -cp) (commandline -op))"
nushell:
# Add to external_completer in config.nu
let external_completer = {|spans|
match $spans.0 {
dotnet => (
dotnet complete (
$spans | skip 1 | str join " "
) | lines
)
}
}
Error Handling
- If
dotnet sdk checkfails: Ensure .NET SDK is installed - If profile file doesn't exist: Create it with the completion script
- If profile file is read-only: Warn user and provide script to add manually
Notes
- .NET 10+ provides native
dotnet completionscommand - Pre-.NET 10 uses
dotnet completewith dynamic scripts - Always back up profile before modifying
- User must restart shell or source profile for changes to take effect