From 80abedbe9ebf65b0bfbc93318921f530c3424f47 Mon Sep 17 00:00:00 2001 From: Pete Davison Date: Sun, 30 Jun 2024 02:07:02 +0000 Subject: [PATCH] feat: completion command --- cmd/task/task.go | 9 ++ completion.go | 34 +++++++ internal/flags/flags.go | 2 + .../docs/deprecations/completion_scripts.mdx | 25 ++++++ website/docs/installation.mdx | 88 +++++++++++-------- 5 files changed, 121 insertions(+), 37 deletions(-) create mode 100644 completion.go create mode 100644 website/docs/deprecations/completion_scripts.mdx diff --git a/cmd/task/task.go b/cmd/task/task.go index 0de907505..439ca9c5a 100644 --- a/cmd/task/task.go +++ b/cmd/task/task.go @@ -83,6 +83,15 @@ func run() error { return nil } + if flags.Completion != "" { + script, err := task.Completion(flags.Completion) + if err != nil { + return err + } + fmt.Println(script) + return nil + } + if flags.Global { home, err := os.UserHomeDir() if err != nil { diff --git a/completion.go b/completion.go new file mode 100644 index 000000000..1ab08e76f --- /dev/null +++ b/completion.go @@ -0,0 +1,34 @@ +package task + +import ( + _ "embed" + "fmt" +) + +//go:embed completion/bash/task.bash +var completionBash string + +//go:embed completion/fish/task.fish +var completionFish string + +//go:embed completion/ps/task.ps1 +var completionPowershell string + +//go:embed completion/zsh/_task +var completionZsh string + +func Completion(completion string) (string, error) { + // Get the file extension for the selected shell + switch completion { + case "bash": + return completionBash, nil + case "fish": + return completionFish, nil + case "powershell": + return completionPowershell, nil + case "zsh": + return completionZsh, nil + default: + return "", fmt.Errorf("unknown shell: %s", completion) + } +} diff --git a/internal/flags/flags.go b/internal/flags/flags.go index 2a1f9476f..4ae50c2ef 100644 --- a/internal/flags/flags.go +++ b/internal/flags/flags.go @@ -38,6 +38,7 @@ var ( Version bool Help bool Init bool + Completion string List bool ListAll bool ListJson bool @@ -80,6 +81,7 @@ func init() { pflag.BoolVar(&Version, "version", false, "Show Task version.") pflag.BoolVarP(&Help, "help", "h", false, "Shows Task usage.") pflag.BoolVarP(&Init, "init", "i", false, "Creates a new Taskfile.yml in the current folder.") + pflag.StringVar(&Completion, "completion", "", "Generates shell completion script.") pflag.BoolVarP(&List, "list", "l", false, "Lists tasks with description of current Taskfile.") pflag.BoolVarP(&ListAll, "list-all", "a", false, "Lists tasks with or without a description.") pflag.BoolVarP(&ListJson, "json", "j", false, "Formats task list as JSON.") diff --git a/website/docs/deprecations/completion_scripts.mdx b/website/docs/deprecations/completion_scripts.mdx new file mode 100644 index 000000000..fef7408bc --- /dev/null +++ b/website/docs/deprecations/completion_scripts.mdx @@ -0,0 +1,25 @@ +--- +slug: /deprecations/completion-scripts/ +--- + +# Completion Scripts + +:::warning + +This deprecation breaks the following functionality: + +- Any direct references to the completion scripts in the Task git repository + +::: + +Direct use of the completion scripts in the `completion/*` directory of the +[github.com/go-task/task][task] Git repository is deprecated. Any shell +configuration that directly refers to these scripts will potentially break in +the future as the scripts may be moved or deleted entirely. Any configuration +should be updated to use the [new method for generating shell +completions][completions] instead. + +{/* prettier-ignore-start */} +[completions]: ../installation.mdx#setup-completions +[task]: https://github.com/go-task/task +{/* prettier-ignore-end */} diff --git a/website/docs/installation.mdx b/website/docs/installation.mdx index 0e75035df..c2b20d18d 100644 --- a/website/docs/installation.mdx +++ b/website/docs/installation.mdx @@ -3,6 +3,9 @@ slug: /installation/ sidebar_position: 2 --- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Installation Task offers many installation methods. Check out the available methods below. @@ -247,65 +250,76 @@ released binary. ## Setup completions -Download the autocompletion file corresponding to your shell. - -[All completions are available on the Task repository](https://github.com/go-task/task/tree/main/completion). +Some installation methods will automatically install completions too, but if +this isn't working for you or your chosen method doesn't include them, you can +run `task --completion ` to output a completion script for any supported +shell. There are a couple of ways these completions can be added to your shell +config: -### Bash +### Option 1. Load the completions in your shell's startup config (Recommended) -First, ensure that you installed bash-completion using your package manager. +This method loads the completion script from the currently installed version of +task every time you create a new shell. This ensures that your completions are +always up-to-date. -Make the completion file executable: + -```shell -chmod +x path/to/task.bash + +```shell title="~/.bashrc" +eval "$(task --completion bash)" ``` + -After, add this to your `~/.bash_profile`: - -```shell -source path/to/task.bash + +```shell title="~/.zshrc" +eval "$(task --completion zsh)" ``` + -### ZSH - -Put the `_task` file somewhere in your `$FPATH`: - -```shell -mv path/to/_task /usr/local/share/zsh/site-functions/_task + +```shell title="~/.config/fish/config.fish" +task --completion fish | source ``` + -Ensure that the following is present in your `~/.zshrc`: - -```shell -autoload -U compinit -compinit -i + +```powershell title="$PROFILE\Microsoft.PowerShell_profile.ps1" +Invoke-Expression (&task --completion powershell) ``` + -ZSH version 5.7 or later is recommended. +### Option 2. Copy the script to your shell's completions directory -### Fish +This method requires you to manually update the completions whenever Task is +updated. However, it is useful if you want to modify the completions yourself. -Move the `task.fish` completion script: + + ```shell -mv path/to/task.fish ~/.config/fish/completions/task.fish +task --completion bash > /etc/bash_completion.d/task ``` + -### PowerShell - -Open your profile script with: - -```powershell -mkdir -Path (Split-Path -Parent $profile) -ErrorAction SilentlyContinue -notepad $profile + +```shell +task --completion zsh > /usr/local/share/zsh/site-functions/_task ``` + -Add the line and save the file: - + ```shell -Invoke-Expression -Command path/to/task.ps1 +task --completion fish > ~/.config/fish/completions/task.fish ``` + {/* prettier-ignore-start */} [go]: https://golang.org/