| # install in /etc/bash_completion.d/ or your personal directory | |
| 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 |