#compdef eselect
_eselect_env () {
	if (( $words[(I)(update)] )); then
		_values "update options" \
		"makelinks[force updating of links]" \
		"noldconfig[Do not alter the ld.so cache or configuration]" && return 0
	fi
	_values "env options" \
	"help[Display help text]" \
	"usage[Display usage information]" \
	"version[Display version information]" \
	'update[Collect environment variables from all scripts]' && return 0
}

_eselect_binutils () {
	local binutilslist
        if (( $words[(I)(set)] )); then
	  binutilslist=(${${${(M)${(f)"$(eselect --no-color binutils list)"}## *}// \**/}//(  \[*\]   |  \[*\]  )/})
	  _values "available binutils version" $binutilslist[@] && return 0
        fi
	_values "binutils options" \
	"help[Display help text]" \
	"usage[Display usage information]" \
	"version[Display version information]" \
	"list[List all installed version of binutils]" \
	"show[Print the currently active binutils version]" \
	"set[Activate one of the installed binutils]" && return 0
}

_eselect_kernel () {
	local kernellist
        if (( $words[(I)(set)] )); then
	  kernellist=(${${${(M)${(f)"$(eselect --no-color kernel list)"}## *}// \**/}//(  \[*\]   |  \[*\]  )/})
	  _values "available kernel version" $kernellist[@] && return 0
        fi
	_values "kenrel options" \
	"help[Display help text]" \
	"usage[Display usage information]" \
	"version[Display version information]" \
	"list[List available kernel symlink targets]" \
	"show[Show the current kernel symlink]" \
	"set[Set a new kernel symlink target]" && return 0
}
_eselect_ctags () {
	local ctagslist
        if (( $words[(I)(set)] )); then
	  ctagslist=(${${${(M)${(f)"$(eselect --no-color ctags list)"}## *}// \**/}//(  \[*\]   |  \[*\]  )/})
	  _values "available ctags version" $ctagslist[@] && return 0
        fi
	_values "ctags options" \
	"help[Display help text]" \
	"usage[Display usage information]" \
	"version[Display version information]" \
	"list[List available ctags symlink targets]" \
	"show[Show the current target of the ctags symlink]" \
	"update[Automatically update the ctags symlink]" \
	"set[Set a new ctags symlink target]" && return 0
}
_eselect_profile () {
	local profilelist
        if (( $words[(I)(set)] )); then
	  profilelist=(${${${(M)${(f)"$(eselect --no-color profile list)"}## *}// \**/}//(  \[*\]   |  \[*\]  )/})
	  _values -w "available profiles" $profilelist[@] \
	  "--force[Forcibly set the symlink]" && return 0
        fi
	_values "profile options" \
	"help[Display help text]" \
	"usage[Display usage information]" \
	"version[Display version information]" \
	"list[List available profile symlink targets]" \
	"show[Show the current make.profile symlink]" \
	"set[Set a new profile symlink target]" && return 0
}
_eselect_fontconfig () {
	local fclistenabled fclistdisabled
        if (( $words[(I)(enable)] )); then
	  fclistdisabled=(${${${${(M)${(f)"$(eselect --no-color fontconfig list)"}## *}#*\*}// \**/}//(  \[*\]   |  \[*\]  )/})
	  _values -w ".conf to enable" $fclistdisabled[@] && return 0
	elif (( $words[(I)(disable)] )); then
	  fclistenabled=(${${${(M)${(M)${(f)"$(eselect --no-color fontconfig list)"}## *}#*\*}// \**/}//(  \[*\]   |  \[*\]  )/})
	  _values -w ".conf to disable" $fclistenabled[@] && return 0
        fi
	_values "fontconfig options" \
	"help[Display help text]" \
	"usage[Display usage information]" \
	"version[Display version information]" \
	"list[List available fontconfig .conf files]" \
	"disable[Disable specified fontconfig .conf file(s)]" \
	"enable[Enable specified fontconfig .conf file(s)]" && return 0
}
_eselect_opengl () {
	local opengllist
	if (( $words[(I)(set)] )); then
		opengllist=(${${${(M)${(f)"$(eselect --no-color opengl list)"}## *}// \**/}//(  \[*\]   |  \[*\]  )/})
		_values -w "opengl implementations and options" $opengllist[@] \
		"--use-old[If an implementationis already set, use that one instead]" \
		"--prefix[Set the source prefix]:path:_files -/" \
		"--dst-prefix[Set the destination prefix]:path:_files -/" \
		"--impl-headers[Override global headers with ones provided by this profile]" && return 0
	fi
	_values "opengl options" \
	"help[Display help text]" \
	"usage[Display usage information]" \
	"version[Display version information]" \
	"list[List the available OpenGL implementations]" \
	"set[Select the OpenGL implementation]" \
	"show[Print the current OpenGL implementation]" && return 0
}
_eselect_vi () {
	local vilist
	if (( $words[(I)(set)] )); then
	  vilist=(${${${(M)${(f)"$(eselect --no-color vi list)"}## *}// \**/}//(  \[*\]   |  \[*\]  )/})
	  _values -w "vi implementation" $vilist[@] && return 0
	elif (( $words[(I)(update)] )); then
	  _values -w "option" "--if-unset[Do not override existing implementation]" && return 0
	fi
	_values "vi options" \
	"help[Display help text]" \
	"usage[Display usage information]" \
	"version[Display version information]" \
	"list[List available vi implementations]" \
	"set[Set a new vi implementation provider]" \
	"show[Show the current vi implementation]" \
	"update[Automatically update the vi provider]"
}
_eselect () {
  local globopts sedcmd modnames modopts

  globopts=(
  	"--no-colour[Disable coloured output]" \
  	"--no-color[Disable coloured output]"
  		)
  modnames=(${${${(M)${(f)"$(eselect --no-color list-modules)"}## *}//   */}//  /})

  if ((CURRENT == 2)); then
    _arguments -s \
      "$globopts[@]" \
      "*:portage:_values 'eselect modules' \$modnames[@]" && return 0
  elif ((CURRENT == 3)); then
    if [[ $words[2] == --no-colour || $words[2] == --no-color ]]; then
      _arguments -s \
        "*:portage:_values 'eselect modules' \$modnames[@]" && return 0
    elif (( $modnames[(I)$words[2]] )); then
      if [[ "$words[2]" == (env|binutils|kernel|ctags|profile|fontconfig|opengl|vi) ]]; then
          _eselect_$words[2] "$@"
      else
        modopts=(${${${(M)${(f)"$(eselect --no-color $words[2] usage)"}## *}//   */}//  /})
        _arguments -s \
          "*:portage:_values 'eselect $words[2] options' \$modopts[@]" && return 0
      fi
    fi
  elif ((CURRENT >= 4)); then
    if (( $words[(I)(--no-color|--no-colour)] )); then
      if (( $modnames[(I)$words[3]] )); then
        if [[ "$words[3]" == (env|binutils|kernel|ctags|profile|fontconfig|opengl|vi) ]]; then
          _eselect_$words[3] "$@"
        else
          modopts=(${${${${(M)${(f)"$(eselect --no-color $words[3] usage)"}## *}//   */}//  /}// *})
           _arguments -s \
              "*:portage:_values 'eselect $words[3] options' \$modopts[@]" && return 0
        fi
      fi
    else
      if (( $modnames[(I)$words[2]] )); then
	  _eselect_$words[2] "$@"
      fi
    fi
  fi
}

_eselect "$@"
