]> Cypherpunks repositories - gostls13.git/commitdiff
misc/bash: Completion for go tool.
authorYissakhar Z. Beck <yissakhar.beck@gmail.com>
Mon, 27 Feb 2012 20:41:49 +0000 (07:41 +1100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 27 Feb 2012 20:41:49 +0000 (07:41 +1100)
This covers most of the tool's functionality. At some point,
support should probably be added for testflags and the various go
tools.

R=golang-dev, bradfitz, kyle, minux.ma
CC=golang-dev
https://golang.org/cl/5646066

misc/bash/go

index caced154f8b4f6b500661b6081b139ba3042256b..f5d79e41ae36f19c06d64441d23a2402158469f0 100644 (file)
@@ -4,3 +4,247 @@ complete -f -X '!*.8' 8l
 complete -f -X '!*.6' 6l
 complete -f -X '!*.5' 5l
 complete -f -X '!*.go' 8g 6g 5g gofmt gccgo
+
+_go_importpath()
+{
+  echo "$(compgen -W "$(go list all) all std" -- "$1")"
+}
+
+_go()
+{
+  # TODO: Only allow flags before other arguments. run already does
+  # this.
+
+  local cur=`_get_cword`
+  local prev="${COMP_WORDS[COMP_CWORD-1]}"
+
+  local cmd="${COMP_WORDS[1]}"
+
+  local cmds="build clean doc fix fmt get
+    install list run test tool version vet"
+  local addhelp="gopath importpath remote
+    testflag testfunc"
+  local other="help"
+
+  if [ "$COMP_CWORD" == 1 ]; then
+    for opt in $cmds; do
+      if [[ "$opt" == "$cmd" ]]; then
+        COMPREPLY=("$opt")
+        return
+      fi
+    done
+  fi
+
+  case "$cmd" in
+    'build')
+      case "$prev" in
+        '-o')
+          _filedir
+          ;;
+        '-p')
+          ;;
+        *)
+          if [[ "$cur" == -* ]]; then
+            COMPREPLY=($(compgen -W "-a -n -o -p -v -x" -- "$cur"))
+          else
+            local found=0
+            for ((i=0; i < ${#COMP_WORDS[@]}; i++)); do
+              case "$i" in
+                0|1|"$COMP_CWORD")
+                  continue
+                  ;;
+              esac
+              local opt="${COMP_WORDS[i]}"
+              if [[ "$opt" != -* ]]; then
+                if [[ "$opt" == *.go && -f "$opt" ]]; then
+                  found=1
+                  break
+                else
+                  found=2
+                  break
+                fi
+              fi
+            done
+            case "$found" in
+              0)
+                _filedir go
+                COMPREPLY+=(`_go_importpath "$cur"`)
+                ;;
+              1)
+                _filedir go
+                ;;
+              2)
+                COMPREPLY=(`_go_importpath "$cur"`)
+                ;;
+            esac
+          fi
+          ;;
+      esac
+      ;;
+    'clean')
+      if [[ "$cur" == -* ]]; then
+        COMPREPLY=($(compgen -W "-i -r -n -x" -- "$cur"))
+      else
+        COMPREPLY=(`_go_importpath "$cur"`)
+      fi
+      ;;
+    'doc')
+      COMPREPLY=(`_go_importpath "$cur"`)
+      ;;
+    'fix')
+      COMPREPLY=(`_go_importpath "$cur"`)
+      ;;
+    'fmt')
+      COMPREPLY=(`_go_importpath "$cur"`)
+      ;;
+    'get')
+      case "$prev" in
+        '-p')
+          ;;
+        *)
+          if [[ "$cur" == -* ]]; then
+            COMPREPLY=($(compgen -W "-a -d -fix -n -p -u -v -x" -- "$cur"))
+          else
+            COMPREPLY=(`_go_importpath "$cur"`)
+          fi
+          ;;
+      esac
+      ;;
+    'install')
+      case "$prev" in
+        '-p')
+          ;;
+        *)
+          if [[ "$cur" == -* ]]; then
+            COMPREPLY=($(compgen -W "-a -n -p -v -x" -- "$cur"))
+          else
+            COMPREPLY=(`_go_importpath "$cur"`)
+          fi
+          ;;
+      esac
+      ;;
+    'list')
+      case "$prev" in
+        '-f')
+          ;;
+        *)
+          if [[ "$cur" == -* ]]; then
+            COMPREPLY=($(compgen -W "-e -f -json" -- "$cur"))
+          else
+            COMPREPLY=(`_go_importpath "$cur"`)
+          fi
+          ;;
+      esac
+      ;;
+    'run')
+      if [[ "$cur" == -* && "$prev" != *.go ]]; then
+        COMPREPLY=($(compgen -W "-a -n -x" -- "$cur"))
+      else
+        _filedir
+      fi
+      ;;
+    'test') # TODO: Support for testflags.
+      case "$prev" in
+        '-file')
+          _filedir go
+          ;;
+        '-p')
+          ;;
+        *)
+          if [[ "$cur" == -* ]]; then
+            COMPREPLY=($(compgen -W "-c -file -i -p -x" -- "$cur"))
+          else
+            COMPREPLY=(`_go_importpath "$cur"`)
+          fi
+          ;;
+        esac
+      ;;
+    'tool')
+      if [ "$COMP_CWORD" == 2 ]; then
+        COMPREPLY=($(compgen -W "$(go tool)" -- "$cur"))
+      else
+        case "${COMP_WORDS[2]}" in
+          [568]a) # TODO: Implement something.
+            #_go_tool_568a
+            ;;
+          [568]c) # TODO: Implement something.
+            #_go_tool_568c
+            ;;
+          [568]g) # TODO: Implement something.
+            #_go_tool_568g
+            ;;
+          [568]l) # TODO: Implement something.
+            #_go_tool_568l
+            ;;
+          'api') # TODO: Implement something.
+            #_go_tool_api
+            ;;
+          'cgo') # TODO: Implement something.
+            #_go_tool_cgo
+            ;;
+          'cov') # TODO: Implement something.
+            #_go_tool_cov
+            ;;
+          'dist') # TODO: Implement something.
+            #_go_tool_dist
+            ;;
+          'ebnflint') # TODO: Implement something.
+            #_go_tool_ebnflint
+            ;;
+          'fix') # TODO: Implement something.
+            #_go_tool_fix
+            ;;
+          'gotype') # TODO: Implement something.
+            #_go_tool_gotype
+            ;;
+          'nm') # TODO: Implement something.
+            #_go_tool_nm
+            ;;
+          'pack') # TODO: Implement something.
+            #_go_tool_pack
+            ;;
+          'pprof') # TODO: Implement something.
+            #_go_tool_pprof
+            ;;
+          'prof') # TODO: Implement something.
+            #_go_tool_prof
+            ;;
+          'vet') # TODO: Implement something.
+            #_go_tool_vet
+            ;;
+          'yacc') # TODO: Implement something.
+            #_go_tool_yacc
+            ;;
+        esac
+        if [[ "$cur" == -* ]]; then
+          COMPREPLY=($(compgen -W "${COMPREPLY[*]} -h" -- "$cur"))
+        fi
+      fi
+      ;;
+    'version')
+      ;;
+    'vet')
+      if [[ "$cur" == -* ]]; then
+        :
+      else
+        COMPREPLY=(`_go_importpath "$cur"`)
+      fi
+      ;;
+    'help')
+      if [ "$COMP_CWORD" == 2 ]; then
+        COMPREPLY=($(compgen -W "$cmds $addhelp" -- "$cur"))
+      fi
+      ;;
+    *)
+      if [ "$COMP_CWORD" == 1 ]; then
+        COMPREPLY=($(compgen -W "$cmds $other" -- "$cur"))
+      else
+        _filedir
+      fi
+      ;;
+  esac
+}
+
+complete $filenames -F _go go
+
+# vim:ts=2 sw=2 et syn=sh