From 22f06590f74246013841511e201bd9403939e0ea Mon Sep 17 00:00:00 2001 From: Matan Rosenberg Date: Tue, 28 Apr 2020 19:53:20 +0300 Subject: [PATCH] genautocomplete: add support for fish shell --- cmd/genautocomplete/genautocomplete_fish.go | 44 +++++++++++++++++++++ cmd/genautocomplete/genautocomplete_test.go | 13 ++++++ 2 files changed, 57 insertions(+) create mode 100644 cmd/genautocomplete/genautocomplete_fish.go diff --git a/cmd/genautocomplete/genautocomplete_fish.go b/cmd/genautocomplete/genautocomplete_fish.go new file mode 100644 index 000000000..edb327b8b --- /dev/null +++ b/cmd/genautocomplete/genautocomplete_fish.go @@ -0,0 +1,44 @@ +package genautocomplete + +import ( + "log" + + "github.com/rclone/rclone/cmd" + "github.com/spf13/cobra" +) + +func init() { + completionDefinition.AddCommand(fishCommandDefinition) +} + +var fishCommandDefinition = &cobra.Command{ + Use: "fish [output_file]", + Short: `Output fish completion script for rclone.`, + Long: ` +Generates a fish autocompletion script for rclone. + +This writes to /etc/fish/completions/rclone.fish by default so will +probably need to be run with sudo or as root, eg + + sudo rclone genautocomplete fish + +Logout and login again to use the autocompletion scripts, or source +them directly + + . /etc/fish/completions/rclone.fish + +If you supply a command line argument the script will be written +there. +`, + Run: func(command *cobra.Command, args []string) { + cmd.CheckArgs(0, 1, command, args) + out := "/etc/fish/completions/rclone.fish" + if len(args) > 0 { + out = args[0] + } + err := cmd.Root.GenFishCompletionFile(out, true) + if err != nil { + log.Fatal(err) + } + }, +} diff --git a/cmd/genautocomplete/genautocomplete_test.go b/cmd/genautocomplete/genautocomplete_test.go index 20c349afb..e97ad1169 100644 --- a/cmd/genautocomplete/genautocomplete_test.go +++ b/cmd/genautocomplete/genautocomplete_test.go @@ -33,3 +33,16 @@ func TestCompletionZsh(t *testing.T) { assert.NoError(t, err) assert.NotEmpty(t, string(bs)) } + +func TestCompletionFish(t *testing.T) { + tempFile, err := ioutil.TempFile("", "completion_fish") + assert.NoError(t, err) + defer func() { _ = tempFile.Close() }() + defer func() { _ = os.Remove(tempFile.Name()) }() + + fishCommandDefinition.Run(fishCommandDefinition, []string{tempFile.Name()}) + + bs, err := ioutil.ReadFile(tempFile.Name()) + assert.NoError(t, err) + assert.NotEmpty(t, string(bs)) +}