Add Bash completion
authorbep <bjorn.erik.pedersen@gmail.com>
Sat, 16 May 2015 16:04:56 +0000 (18:04 +0200)
committerbep <bjorn.erik.pedersen@gmail.com>
Sat, 16 May 2015 16:04:59 +0000 (18:04 +0200)
Add a new command, genautocomplete, wich generates a Bash completion script (zsh and others later).

The script is by default written to `/etc/bash_completion.d/hugo.sh`; this can be set in `--completionfile=/some/file`.

Fixes #438

commands/genautocomplete.go [new file with mode: 0644]
commands/hugo.go

diff --git a/commands/genautocomplete.go b/commands/genautocomplete.go
new file mode 100644 (file)
index 0000000..a149f78
--- /dev/null
@@ -0,0 +1,45 @@
+package commands
+
+import (
+       "github.com/spf13/cobra"
+       jww "github.com/spf13/jwalterweatherman"
+)
+
+var autocompleteTarget string
+
+// bash for now (zsh and others will come)
+var autocompleteType string
+
+var genautocompleteCmd = &cobra.Command{
+       Use:   "genautocomplete",
+       Short: "Generate shell autocompletion script for Hugo",
+       Long: `Generates a shell autocompletion script for Hugo.
+       
+       NOTE: The current version supports Bash only. This should work for *nix systems with Bash installed.
+       
+       By default the file is written directly to /etc/bash_completion.d for convenience and the command may need superuser rights, e.g:
+       
+       sudo hugo genautocomplete
+       
+       Add --completionfile=/path/to/file flag to set alternative file-path and name.
+       
+       Logout and in again to reload the completion scripts or just source them in directly:
+       
+       . /etc/bash_completion
+       `,
+       Run: func(cmd *cobra.Command, args []string) {
+               if autocompleteType != "bash" {
+                       jww.FATAL.Fatalln("Only Bash is supported for now")
+               }
+               err := cmd.Root().GenBashCompletionFile(autocompleteTarget)
+               if err != nil {
+                       jww.FATAL.Fatalln("Failed to generate shell completion file:", err)
+               }
+       },
+}
+
+func init() {
+       genautocompleteCmd.PersistentFlags().StringVarP(&autocompleteTarget, "completionfile    ", "", "/etc/bash_completion.d/hugo.sh", "Autocompletion file")
+       genautocompleteCmd.PersistentFlags().StringVarP(&autocompleteType, "type", "", "bash", "Autocompletion type (currently only bash supported)")
+
+}
index 47d3a99045dbe7b7604f8d39dbd065583ed84205..098301f3bdac4b386cdb21486dedd2f945c9e72d 100644 (file)
@@ -76,6 +76,7 @@ func AddCommands() {
        HugoCmd.AddCommand(newCmd)
        HugoCmd.AddCommand(listCmd)
        HugoCmd.AddCommand(undraftCmd)
+       HugoCmd.AddCommand(genautocompleteCmd)
 }
 
 //Initializes flags
@@ -103,6 +104,12 @@ func init() {
        HugoCmd.Flags().BoolVarP(&NoTimes, "noTimes", "", false, "Don't sync modification time of files")
        hugoCmdV = HugoCmd
 
+       // for Bash autocomplete
+       validConfigFilenames := []string{"json", "js", "yaml", "yml", "toml", "tml"}
+       annotation := make(map[string][]string)
+       annotation[cobra.BashCompFilenameExt] = validConfigFilenames
+       HugoCmd.PersistentFlags().Lookup("config").Annotations = annotation
+
        // This message will be shown to Windows users if Hugo is opened from explorer.exe
        cobra.MousetrapHelpText = `